如何将数据推送到MongoDB中的现有文档?

时间:2015-05-18 08:15:11

标签: javascript node.js mongodb

我的问题是我想将数据推送到MongoDb文档中数组中的指定位置,但是当我推送新数据时,它并没有将它添加到正确的位置。

运行此更新语句时:

collection.update({ "schraenke.name": "Schrank1" }, {
                    $push:
                    {
                        "schraenke": [{
                            "masterbricks": {
                                "sensor1": { value: "test" }
                            }
                        }]
                    }
                });`

上述更新的结果是文件:

{
    "_id": "55599876095c6bac18209dfa",
    "name": "Serverraum1",
    "schraenke": [
      {
        "name": "Schrank1",
        "nummer": "1",
        "reihe": "1",
        "masterbricks": {
          "name": "Mastrebrick2.0",
          "uid": "6dKiRt",
          "he": "1-20",
          "sensor1": {
            "name": "Temperatur",
            "uid": "qvf"
          }
        }
      },
      [
        {
          "masterbricks": {
            "sensor1": {
              "value": "test"
            }
          }
        }
      ],

    ]
  }

值字段应添加到"sensor1",但它会添加一个新数组。

我的预期结果是:

{ 
    "_id": "55599876095c6bac18209dfa", 
    "name": "Serverraum1", 
    "schraenke": [ 
        { 
           "name": "Schrank1", 
           "nummer": "1", 
           "reihe": "1", 
           "masterbricks": { 
               "name": "Mastrebrick2.0", 
               "uid": "6dKiRt", 
               "he": "1-20", 
               "sensor1": { 
                   "name": "Temperatur", 
                   "uid": "qvf", 
                   "value" : "test" 
               } 
           } 
       }, 
   ] 
}

我做错了什么?

3 个答案:

答案 0 :(得分:4)

您需要在更新中应用$push运算符和 $set ,而不是使用$ positional operator,以便将新文档推送到正确的位置。 $ positional operator 将标识要更新的数组中的正确元素,而不显式指定元素在数组中的位置,因此最终的更新语句应如下所示:

db.collection.update({ "schraenke.name": "Schrank1" }, 
    {
        "$set": {
            "schraenke.$.masterbricks.sensor1.value": "test" 
        }
    }
)

<强>结果

/* 0 */
{
    "_id" : "55599876095c6bac18209dfa",
    "name" : "Serverraum1",
    "schraenke" : [ 
        {
            "name" : "Schrank1",
            "nummer" : "1",
            "reihe" : "1",
            "masterbricks" : {
                "name" : "Mastrebrick2.0",
                "uid" : "6dKiRt",
                "he" : "1-20",
                "sensor1" : {
                    "name" : "Temperatur",
                    "uid" : "qvf",
                    "value" : "test"
                }
            }
        }
    ]
}

答案 1 :(得分:0)

$push添加数组字段,并将值作为元素。

您应该使用$Set

collection.update({ "schraenke.name": "Schrank1" }, {
                    $set:
                    {
                        "schraenke": [{
                            "masterbricks": {
                                "sensor1": { value: "test" }
                            }
                        }]
                    }
                });

答案 2 :(得分:0)

如果您使用$push,则使用以下更新查询将"value" : ["test"]数组添加到sensor1中:

db.collectionName.update({"schraenke.name":"Schrank1"},
  {"$push":{"schraenke.$.masterbricks.sensor1.value":"test"}})

而不是push如上所述使用$set chridam ,并在集合中使用upsert true