MongoDB 通过动态 ID 更新嵌套项目
MongoDB update nested item by dynamical ID
嘿,我正在尝试更新 MongoDB 中的嵌套对象。
它们的结构是
[
{
"_id": "5871010d1ff9831574e7178d",
"created_at": "2017-01-07T14:54:05.791Z",
"updated_at": "2017-01-07T14:54:05.791Z",
"place_id": "ChIJ1eTO6eS1vkcRL_mX2RWUKo4",
"name": "Kunstwerk Restaurant Gummersbach",
"__v": 0,
"cooks": [],
"menus": [
{
"58727068ba8d6c04a0ea331f": [
{
"intolerances": {
"intolerance" : "false"
...
},
"nutritiondata" : [
{...}
],
"cookname": "testkoch@test.de",
"menuname": "MenünameX"
}
]
}
]
菜单中的嵌套 ID 是动态创建的 MongoDB 文档的另一个 ID。
我尝试更新菜单名称,但无法访问它,因为 mongo 总是 returns null 或找不到元素,因为只需要搜索键而不是键 - 值对.
到目前为止我测试了什么:
db.restaurants.update({ 'menus.58727068ba8d6c04a0ea331f', { $set : {"menus.$.menuname" : "test"}}});
db.restaurants.findOne({ 'menus.58727068ba8d6c04a0ea331f' : "58727068ba8d6c04a0ea331f"});
db.restaurants.find({ menus : { $elemMatch : {"58727068ba8d6c04a0ea331f": "58727068ba8d6c04a0ea331f" }}});
db.restaurants.findOne({ menus : { $eq : "58727068ba8d6c04a0ea331f" }});
使用如下所示的$set
方法:
db.restaurants.update({"_id":"5871010d1ff9831574e7178d"}, {$set: {"menus.58727068ba8d6c04a0ea331f.0.menuname":"test"});
只有当您知道数组中正在更新的项目的索引时,这才有效。
检查这个 Page,它有一些关于更新多级嵌套数组的好例子,希望它能有所帮助。
感谢 suzo,我找到了解决方案。
有效的 MongoShell 代码:
db.restaurants.update({"_id" : ObjectId("5871010d1ff9831574e7178d")}, {$set: {"menus.58727068ba8d6c04a0ea331f.0.menuname" : "testName"}});
更新:
因为我的字段是混合类型,所以这不会在没有标记的情况下更新!。所以这里是完整的正确代码:
Restaurant.findOne({ _id : req.body.r_id }, function(error, restaurant){
if(error) console.log(error);
for(var i = 0; i < restaurant.menus.length; i++){
restaurant.markModified('menus');
if(restaurant.menus[i][req.params.id] != undefined){
restaurant.menus[i][req.params.id].menuname = req.body.name;
}
if(i == restaurant.menus.length-1){
restaurant.save();
res.json(jObj);
}
}
})
嘿,我正在尝试更新 MongoDB 中的嵌套对象。
它们的结构是
[
{
"_id": "5871010d1ff9831574e7178d",
"created_at": "2017-01-07T14:54:05.791Z",
"updated_at": "2017-01-07T14:54:05.791Z",
"place_id": "ChIJ1eTO6eS1vkcRL_mX2RWUKo4",
"name": "Kunstwerk Restaurant Gummersbach",
"__v": 0,
"cooks": [],
"menus": [
{
"58727068ba8d6c04a0ea331f": [
{
"intolerances": {
"intolerance" : "false"
...
},
"nutritiondata" : [
{...}
],
"cookname": "testkoch@test.de",
"menuname": "MenünameX"
}
]
}
]
菜单中的嵌套 ID 是动态创建的 MongoDB 文档的另一个 ID。
我尝试更新菜单名称,但无法访问它,因为 mongo 总是 returns null 或找不到元素,因为只需要搜索键而不是键 - 值对.
到目前为止我测试了什么:
db.restaurants.update({ 'menus.58727068ba8d6c04a0ea331f', { $set : {"menus.$.menuname" : "test"}}});
db.restaurants.findOne({ 'menus.58727068ba8d6c04a0ea331f' : "58727068ba8d6c04a0ea331f"});
db.restaurants.find({ menus : { $elemMatch : {"58727068ba8d6c04a0ea331f": "58727068ba8d6c04a0ea331f" }}});
db.restaurants.findOne({ menus : { $eq : "58727068ba8d6c04a0ea331f" }});
使用如下所示的$set
方法:
db.restaurants.update({"_id":"5871010d1ff9831574e7178d"}, {$set: {"menus.58727068ba8d6c04a0ea331f.0.menuname":"test"});
只有当您知道数组中正在更新的项目的索引时,这才有效。 检查这个 Page,它有一些关于更新多级嵌套数组的好例子,希望它能有所帮助。
感谢 suzo,我找到了解决方案。 有效的 MongoShell 代码:
db.restaurants.update({"_id" : ObjectId("5871010d1ff9831574e7178d")}, {$set: {"menus.58727068ba8d6c04a0ea331f.0.menuname" : "testName"}});
更新: 因为我的字段是混合类型,所以这不会在没有标记的情况下更新!。所以这里是完整的正确代码:
Restaurant.findOne({ _id : req.body.r_id }, function(error, restaurant){
if(error) console.log(error);
for(var i = 0; i < restaurant.menus.length; i++){
restaurant.markModified('menus');
if(restaurant.menus[i][req.params.id] != undefined){
restaurant.menus[i][req.params.id].menuname = req.body.name;
}
if(i == restaurant.menus.length-1){
restaurant.save();
res.json(jObj);
}
}
})