mongodb-collection中的单个对象[v 3.0.2]

时间:2015-07-29 08:58:27

标签: node.js mongodb mongodb-query

我想要一个只包含一个元素的集合(测试)。因此,我将更新查询设置为空对象:

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”}。 它覆盖了集合中唯一的元素。 为什么会这样?

2 个答案:

答案 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' } ]

正如预期的那样。