我就爱吃芒果

芒果很好吃,吃起来也很方便,皮拨了就可以吃,
什么,还要洗,妈妈告诉我:不干不净,吃了没病。
喜欢归喜欢,但你千万别把核都吃掉啊,
小时候,妈妈告诉我:吃了核,就得肺结核。

数据库的四大能力是:增、删、改、查。

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,更改文章时只能更改内容,而不能更改标题和发布时间。
见下面代码:

//读取posts集合
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中如果这样写:

//读取posts集合
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);
});
});

好了,我们现在就可以同时更改标题、发布时间、文章内容了。
理解同一个命令在不同上下文中的差异,观察文档的注释,非常重要啊。