我就爱吃芒果 芒果很好吃,吃起来也很方便,皮拨了就可以吃, 什么,还要洗,妈妈告诉我:不干不净,吃了没病。 喜欢归喜欢,但你千万别把核都吃掉啊, 小时候,妈妈告诉我:吃了核,就得肺结核。
数据库的四大能力是:增、删、改、查。 db.collection .insert (obj) db.collection .remove (query) db.bench .update (query, object [, upsert_bool, multi_bool]) - instead of two flags, you can pass an object with fields: upsert, multi db.collection .find ([query],[fields])
看这个命令长短就知道了,修改数据最复杂。 所以update就形如芒果中的核,你一定得要小心处理,不能随便就吞掉肚子里去。 在N-blog ,更改文章时只能更改内容,而不能更改标题和发布时间。 见下面代码:
db .collection('posts',function (err ,collection){ if (err ){ mongodb.close (); return callback(err ); } collection.update ({ "name" :name, "time.day" :day, "title" :title },{ $set : {post : post } },function(err ){ mongodb.close (); if (err ){ return callback(err ); } callback(null); }); });
为什么不能同时更改标题、发布时间、文章内容呢? 在mongo命令行中同时更改多条数据当然简单:
db.collection .update (query, object , false, true]
但是在node.js中如果这样写:
db .collection('posts',function (err ,collection){ if (err ){ mongodb.close (); return callback(err ); } collection.update ({ "name" :name, "time.day" :day, "title" :title },{ $set : {post : post } },false,true,function(err ){ mongodb.close (); if (err ){ return callback(err ); } callback(null); }); });
控制台输出Error: writeConcern requires callback 在mongo命令行中,可以这样写,但在node.js中这样写会报错。 为什么呢? mongo命令行中传输参数支持flag,也支持object, 但node.js中传输参数不支持flag,只支持object。 你仔细看下这行命令的注释就明白了:
db.bench.update(query, object [, upsert_bool, multi_bool]) - instead of two flags , you can pass an object with fields : upsert, multi
就这么一个简单的功能点,想当初实现起来花了不少时间。 改进如下:
db .collection('posts',function (err ,collection){ if (err ){ mongodb.close (); return callback(err ); } collection.update ({ "name" :name, "time.day" :day, "title" :title },{ $set : {post : post , tag: tag, title: new_title} },{ upsert:false, multi:true },function(err ){ mongodb.close (); if (err ){ return callback(err ); } callback(null); }); });
好了,我们现在就可以同时更改标题、发布时间、文章内容了。 理解同一个命令在不同上下文中的差异,观察文档的注释,非常重要啊。