2015-05-18 73 views
2

我的問題是我想要將數據推送到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" 
       } 
      } 
     }, 
    ] 
} 

我在做什麼錯?

+0

您的預期成果是什麼?你的'value'字段應該是一個數組還是一個單值? – bagrat

+0

我期待的結果是: { 「_id」: 「55599876095c6bac18209dfa」, 「名」: 「Serverraum1」, 「schraenke」: { 「名」: 「Schrank1」, 「nummer」:「 1「, 」reihe「:」1「, 」masterbricks「:{ 」name「:」Mastrebrick2。0" , 「UID」: 「6dKiRt」, 「他」: 「1-20」, 「傳感器1」:{ 「名」: 「Temperatur」, 「UID」: 「QVF」, 「值「: 」測試「 }} } , ] } – mk2015

+0

該值被添加到傳感器1 – mk2015

回答

0

$push添加數組作爲其元素的數組字段。

您應該使用$Set

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

您的示例覆蓋現有數據,dosent會添加任何內容。 – mk2015

+0

查看@ chridam的回答。它應該只是覆蓋「value」字段而不是傳感器1 –

4

而不是使用$push你需要與$ positional operator一起應用$set運營商在升級到新文檔推入正確位置。該$ 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" 
       } 
      } 
     } 
    ] 
} 
0

如果使用$push然後"value" : ["test"]陣列將使用下面的更新查詢加入sensor1

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

代替push使用$set和在組中使用upserttrue

+1

['不要使用位置操作符$ with upsert操作,因爲插入將使用$作爲插入文檔中的字段名稱。](http://docs.mongodb .org/manual/reference/operator/update/positions /#upsert) – bagrat

+0

是的,想要添加一個新的值,並且該值不應該被覆蓋,它應該創建一個新的值數組 – mk2015

+0

我的新查詢是:'collection.update ({「schraenke.name」:「Schrank1」},{$ set:{「schraenke。$。masterbricks.sensor1.value」:「Test」}},{upsert:true});' 但它覆蓋現有的值 – mk2015

相關問題