考虑以下
用户收集&示例用户文档
{
"_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;数组)
没问题,那么:)
答案 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);
});
}