3.从Node.js操作MongoDB文档
1.更新文档结构,而非SQL
2.数据库更新运算符
在MongoDB中执行对象的更新时,需要确切的指定需要改变什么字段。需要如何改变。不像SQL语句建立冗长的查询字符串来定义更新。
MongoDB中可以实现update对象与运算符定义如何改变文档中的数据
{
<operator>:{<field_operation>,<field_operation>,...},
<operator>:{<field_operation>,<field_operation>,...}
...
}
{ name:'myName', countA:0, countB:0, days:["Monday","Wednesday"], scores:[{id:"test1",score:94},{id:"test2",score:85},{id:"test3",score:97}] } //进行update { $inc:{countA:5,countB:1}, $set:{name:"New Name"}, $sort:{score:1} }
3.将文档添加到集合
用MongoDB的数据库进行交互的另一个常见任务是往集合中插入文档。
要插入一个文档,首先是创建JavaScript对象表示要存储的文档。因为MongoDB使用的BSON格式是基于JavaScript符号的,再此创建一个JavaScript对象。
insert(docs,[options],callback)
把文档插入到集合。
var MongoClient=require('mongodb').MongoClient; function addObject(collection,object){ collection.insert(object,function(err,result){ if(!err){ console.log('Insert : '); console.log(result); } }); } MongoClient.connect("mongodb://localhost/",function(err,db){ var myDB=db.db("astro"); myDB.dropCollection("nebulae"); myDB.createCollection("nebulae",function(err,nebulae){ addObject(nebulae,{ngc:"NGC 10001",name:"Helix",type:"planetary",location:"Aquila"}); addObject(nebulae,{ngc:"NGC 20001",name:"Cat's Eye",type:"planetary",location:"Draco"}); }) setTimeout(function(){db.close();console.log('db closed')},3000) })
4.从集合获取文档
对于存储在MongoDB数据库中的数据,通常需要执行:检索一个或多个文档。
如:商业网站上的产品的产品信息,信息被储存一次但检索多次(筛选,排序,汇总)
find(query,[options],callback)
findOne(query,[options],callback)
query对象包含了与文档的字段匹配的属性。与query对象匹配的文档包含在列表中。
options参数是一个对象,指定有关查找文档(限制,排序和返回值)
不同之处是回调函数:find()方法返回一个可在检索的文档上迭代的Cursor对象。findOne()返回单个对象。
利用find()和findOne(),在MongoDB中查找文档
var MongoClient=require('mongodb').MongoClient; MongoClient.connect("mongodb://localhost/",function(err,db){ var myDB=db.db("astro"); myDB.collection("nebulae",function(err,nebulae){ nebulae.find(function(err,items){ items.toArray(function(err,itemArr){ console.log('Document Array: '); console.log(itemArr); }); }); nebulae.find(function(arr,items){ items.each(function(err,item){ if(item){ console.log('singular document'); console.log(item); } }) }); nebulae.findOne({name:'Helix'},function(err,item){ console.log('found one: '); console.log(item); }) }) setTimeout(function(){db.close();console.log('close db');},3000); })
更新集合中的文档
update(query,update,[options],[callback])
var MongoClient = require('mongodb').MongoClient; MongoClient.connect("mongodb://localhost/", function(err, db) { var myDB = db.db("astro"); myDB.collection("nebulae", function(err, nebulae) { nebulae.find({ type: "planetary" }, function(err, items) { items.toArray(function(err, itemArr) { console.log("before update: "); console.log(itemArr); nebulae.update({ type: "planetary", $isolated: 1 }, { $set: { type: "Plane", update: true }}, { upsert: false, multi: true, w: 1 }, function(err, results) { nebulae.find({type:"Plane"}).toArray(function(err, docs) { console.log("after update: "); console.log(docs); db.close(); }); } ) }) }) }) })
原子地修改文档的集合
findAndModify(query,sort,update,[options],callback)
var MongoClient=require('mongodb').MongoClient; MongoClient.connect("mongodb://localhost/",function(err,db){ var myDB=db.db('astro'); myDB.collection("nebulae",function(err,nebulae){ nebulae.find({name:"Helix"},function(err,items){ items.toArray(function(err,itemArr){ console.log("before modify: "); console.log(itemArr); nebulae.findAndModify({location:"Draco"},[['name',1]], {$set:{location:'Draco_FF',"update":true}}, {w:1,new:true},function(err,doc){ console.log('after modify: '); console.log(doc); db.close(); } ) }) }) }) })
保存集合中的文档
save(doc,[options],[callback])
var MongoClient=require('mongodb').MongoClient; MongoClient.connect("mongodb://localhost/",function(err,db){ var myDB=db.db('astro'); myDB.collection("nebulae",function(err,nebulae){ nebulae.findOne({type:"Plane"},function(err,item){ console.log("before save: "); console.log(item); item.info="some New Info"; nebulae.save(item,{w:1},function(err,results){ nebulae.findOne({_id:item._id},function(err,savedItem){ console.log("after saved: "); console.log(savedItem); db.close(); }) }) }) }) })
使用upsert往集合中插入文档
var MongoClient=require('mongodb').MongoClient; MongoClient.connect("mongodb://localhost/",function(err,db){ var myDB=db.db("astro"); myDB.collection("nebulae",function(err,nebulae){ nebulae.find({type:"diffuse"},function(err,items){ items.toArray(function(err,itemArr){ console.log("before upsert: "); console.log(itemArr); nebulae.update({type:"diffuse"}, {$set:{ngc:"NGC 3372",name:"Carina",type:"diffuse",location:"Carina"}}, {upsert:true,w:1,forceServerObjectId:false}, function(err,results){ nebulae.find({type:"diffuse"},function(err,items){ items.toArray(function(err,itemArr){ console.log('after upsert 1: '); console.log(itemArr); var itemID=itemArr[0]._id; nebulae.update({_id:itemID}, {$set: {ngc:"NGC 3373",name:"Carina",type:"Diffuse",location:"Carina"}}, {update:true,w:1}, function(err,results){ nebulae.findOne({_id:itemID},function(err,item){ console.log('after upsert 2: '); console.log(item); db.close(); }) } ) }) }) } ) }) }) }) })
从集合中删除文档
remove([query],[options],[callback])
var MongoClient=require('mongodb').MongoClient; MongoClient.connect("mongodb://localhost/",function(err,db){ var myDB=db.db("astro"); myDB.collection("nebulae",function(err,nebulae){ nebulae.find(function(err,items){ items.toArray(function(err,itemArr){ console.log('before delete: '); console.log(itemArr); nebulae.remove({type:"Diffuse"},function(err,results){ console.log('delete: '+results+" document."); nebulae.find(function(err,items){ items.toArray(function(err,itemArr){ console.log('after delete: '); console.log(itemArr); db.close(); }) }) }) }) }) }) })
从集合中删除单个文档
findAndRemove(query,sort,[options],callback)
var MongoClient = require('mongodb').MongoClient; MongoClient.connect("mongodb://localhost/", function(err, db) { var myDB = db.db("astro"); myDB.collection("nebulae", function(err, nebulae) { nebulae.find().toArray(function(err, docs) { console.log("before delete: "); console.log(docs); nebulae.findAndRemove({ type: "Diffuse" }, [ ['name',1] ], { w: 1 }, function(err, results) { console.log('deleted:\n' + results); nebulae.find().toArray(function(err, itemArr) { console.log('after delete: '); console.log(itemArr); db.close(); }) }) }) }) })
...