[英]Insert Into Array of object MongoDB
我有
{
"_id" : ObjectId("5a25af80d2c4dd065991dccc"),
"username" : "abc@gmail.com",
"password" : "$2a$10$ptFyLKtyyrL5gMYdXS6wV.HLUA4Py5iudMJDldf5qsHFS4.9TPCyy",
"role" : "Admin",
"__v" : 0,
"list" : [
{
"name" : "We",
"arr" : [
"5a26d554677475818a795f75",
"5a395bb0976d5304c07f7dd4"
]
},
{
"name" : "sandeep",
"arr" : [
"5a26d554677475818a795f75"
]
}
]
}
我想在list.arr中添加一个name ='we'的元素,并仅在该元素不存在时添加
我如何执行此查询。
如果我正确理解了您的问题,您想使用we
键来匹配name
字段,并且仅在存在时更新arr
吗?,您必须使用elemMatch来获取正确的文档
db.test.update({ list: { $elemMatch: { name: "We" , arr: { $nin: [ "valuette" ] }} } }, { $push: { "list.$.arr": "valuette" } } );
$
“ list。$。arr”中的$匹配与name
字段匹配的指定索引, we
值
更新:回答OP问题
初始数据库结构
> db.collection.find().pretty()
{
"_id" : ObjectId("5a25af80d2c4dd065991dccc"),
"username" : "abc@gmail.com",
"password" : "$2a$10$ptFyLKtyyrL5gMYdXS6wV.HLUA4Py5iudMJDldf5qsHFS4.9TPCyy",
"role" : "Admin",
"__v" : 0,
"list" : [
{
"name" : "We",
"arr" : [
"5a26d554677475818a795f75",
"5a395bb0976d5304c07f7dd4"
]
},
{
"name" : "sandeep",
"arr" : [
"5a26d554677475818a795f75"
]
}
]
}
查询执行
> db.collection.update({ list: { $elemMatch: { name: "We" , arr: {$nin: ["55555555555555555"]} } } }, { $push: { "list.$.arr": "55555555555555555" } } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
新的数据库结构
> db.collection.find().pretty()
{
"_id" : ObjectId("5a25af80d2c4dd065991dccc"),
"username" : "abc@gmail.com",
"password" : "$2a$10$ptFyLKtyyrL5gMYdXS6wV.HLUA4Py5iudMJDldf5qsHFS4.9TPCyy",
"role" : "Admin",
"__v" : 0,
"list" : [
{
"name" : "We",
"arr" : [
"5a26d554677475818a795f75",
"5a395bb0976d5304c07f7dd4",
"55555555555555555"
]
},
{
"name" : "sandeep",
"arr" : [
"5a26d554677475818a795f75"
]
}
]
}
再次执行相同的查询
> db.collection.update({ list: { $elemMatch: { name: "We" , arr: {$nin: ["55555555555555555"]} } } }, { $push: { "list.$.arr": "55555555555555555" } } )
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
再次检查数据库结构
> db.collection.find().pretty()
{
"_id" : ObjectId("5a25af80d2c4dd065991dccc"),
"username" : "abc@gmail.com",
"password" : "$2a$10$ptFyLKtyyrL5gMYdXS6wV.HLUA4Py5iudMJDldf5qsHFS4.9TPCyy",
"role" : "Admin",
"__v" : 0,
"list" : [
{
"name" : "We",
"arr" : [
"5a26d554677475818a795f75",
"5a395bb0976d5304c07f7dd4",
"55555555555555555"
]
},
{
"name" : "sandeep",
"arr" : [
"5a26d554677475818a795f75"
]
}
]
}
找不到变化
通过使用此嵌套查询,我解决了这个问题。 我正在使用Node JS
router.post('/prevList', (req, res) => {
User.update({'_id':req.user.id, list: { $elemMatch: { name: req.body.name } } },{ $addToSet: { "list.$.arr": {$each: req.body.arr} } },function(err,data) {
console.log(data);
res.send(data)
});
});
这里
req.body: {name:'we',arr:["5a395bb0976d5304c07f7dd4"]}
req.user.id
是身份验证ID。
希望这对您也有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.