嵌套数组项中的$ addToSet

时间:2016-06-11 12:57:44

标签: node.js mongodb

考虑以下

用户收集&示例用户文档

{ 
"_id" : ObjectId("575c01f7b8e5999addeb598c"), 
"username" : "test.1@gmail.com", 
"password" : "<password>", 
"firstName" : "Test, 
"lastName" : "User"
}

我正在尝试运行更新请求以在userData.eventData中添加一个条目,该条目是一个数组

在mongo脚本中,我可以做到

> db.Users.update({_id: ObjectId("575c01f7b8e5999addeb598c")}, {"$addToSet":{"userData.eventData":"My event"}} )

我得到以下结果:userData创建为Object,eventData创建为嵌套数组

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.Users.find({_id: ObjectId("575c01f7b8e5999addeb598c")})
{ "_id" : ObjectId("575c01f7b8e5999addeb598c"), "username" : "test.1@gmail.com", "password" : "<password>", "firstName" : "Test", "lastName" : "User", "userData" : { "eventData" : [ "My event" ] } }

在mongo中运行相同的逻辑(使用驱动程序版本2.1.21)

// with a properly initialized db object
db.collection("Users").update({"_id" : ObjectId("575c01f7b8e5999addeb598c")}, {"$addToSet": { "userData.eventData": "My Event"}}, function(err, result) {
    // do something
});

我收到以下回复

result:Object
    n:0
    nModified:0
    ok:1

确实数据库条目没有变化。

这是它的表现方式吗?我可以通过创建userData.eventData数组轻松解决这个问题,但我发现令人不安的是节点的Mongo驱动程序和mongo shell在这个行为上没有相同的事实

提前感谢您的帮助&amp;建议

编辑13/6/16 错误在我身边,我错过了一个新的&#39;在&#39; ObjectId之前(...&#39;在节点中。有了它,它的行为与mongo shell中的行为完全相同(即&#39; userData&#39;被创建为一个对象,它包括&#39; ; eventData&#39;数组)

没问题,那么:)

1 个答案:

答案 0 :(得分:0)

Update,更新文档中已存在的对象。 您想要的是insert或使用upset,当没有文档符合查询条件时,会创建新文档

db.collection.update(
   { name: "Andy" },
   {
      name: "Andy",
      rating: 1,
      score: 1
   },
   { upsert: true }
); 

如果要将对象添加到数组中,则需要$ push

// Insert a document in the capped collection
 function push (db, collection, search, data, callback) {
    db.collection(collection).update(
        search, {
            $push: data
        }, function (err, result) {
            console.log("New object pushed");
            callback(err);
        });
}