MongoDB按动态ID

时间:2017-01-08 18:06:42

标签: javascript mongodb mongoose mongo-shell

嘿,我正在尝试更新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。

我尝试更新menuname,但无法访问它,因为mongo总是返回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" }});

2 个答案:

答案 0 :(得分:1)

使用Weapon方法,如下所示:

$set

仅当您知道正在更新的数组中的项目的索引时,此方法才有效。 检查这个Page,它有一些关于更新多级嵌套数组的好例子,希望它会有所帮助。

答案 1 :(得分:1)

非常感谢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);
        }
    }

  })