我想要一个只包含一个元素的集合(测试)。因此,我将更新查询设置为空对象:
db.test.find() -> empty
var mongoData = {"name": "Biff"};
db.test.update({}, mongoData, {upsert:true}, cb);
db.test.find() -> {"name": "Biff", "_id":"1"}
var mongoData = {"name": "Buff"};
db.test.update({}, mongoData, {upsert:true}, cb);
db.test.find() -> {"name": "Buff", "_id":"1"}
为什么不是这样:
db.test.find() -> empty
var mongoData = {"name": "Biff"};
db.test.update({}, mongoData, {upsert:true}, cb);
db.test.find() -> {"name": "Biff", "_id":"1"}
var mongoData = {"name": "Buff"};
db.test.update({}, mongoData, {upsert:true}, cb);
db.test.find() -> [{"name": "Biff", "_id":"1"}, {"name": "Buff", "_id":"2"}]
更新空对象“{}”似乎确保此集合中没有创建另一个元素。我想,找不到{},所以{“name”:“Biff”}被创建并且_id被设置为它。如果我尝试再次更新{},则不会再使用不同的_id创建{“name”:“Biff”}。 它覆盖了集合中唯一的元素。 为什么会这样?
答案 0 :(得分:3)
这里没有问题,因为MongoDB就是这样的。 insert
的{{1}}部分仅在匹配条件未达到任何文档的情况下发生:
upsert:如果设置为true,则在没有文档与查询条件匹配时创建新文档
因此,在您的情况下,查找条件(空文档upsert
)与集合中的所有文档匹配,因此它不会{}
新文档,而是更新所有现有文档。
答案 1 :(得分:3)
我对此称错:
以下是代码清单以证明它,如果您自己的代码不同,那么这应该是一个指南:
var async = require('async'),
mongodb = require('mongodb'),
MongoClient = mongodb.MongoClient;
MongoClient.connect('mongodb://localhost/test',function(err,db) {
if (err) throw err;
var collection = db.collection('bifftest');
async.eachSeries(
["Biff","Buff"],
function(name,callback) {
collection.update({},{ "name": name },{ "upsert": true },callback);
},
function(err) {
if (err) throw err;
collection.find({}).toArray(function(err,results) {
if (err) throw err;
console.log(results);
});
}
);
});
返回:
[ { _id: 55b8992dcc8638610dca2e7c, name: 'Buff' } ]
正如预期的那样。