2016-03-20 92 views
3

我是mongoDB的新手。我在更新mongoDB集合中的記錄方面遇到了一些麻煩。將元素插入MongoDB中的嵌套數組

如何添加元素到數組「喜歡」到嵌入式記錄

我有一個嵌入式的收集,如:

{ 
 
     "_id" : "iL9hL2hLauoSimtkM", 
 
     "title" : "Some Topic", 
 
     "followers" : [ 
 
      "userID1", 
 
      "userID2", 
 
      "userID3" 
 
     ], 
 
     "comments" : [ 
 
      { 
 
       "comment" : "Yes Should be....", 
 
       "userId" : "a3123", 
 
       "likes" : [ 
 
          "userID1", 
 
          "userID2" 
 
         ] 
 
      }, 
 
      { 
 
       "comment" : "No Should not be....", 
 
       "userId" : "ahh21", 
 
       "likes" : [ 
 
          "userID1", 
 
          "userID2", 
 
          "userID3" 
 
         ] 
 
      } 
 
     ] 
 
    }

我想更新紀錄

{ 
 
     "_id" : "iL9hL2hLauoSimtkM", 
 
     "title" : "Some Topic", 
 
     "followers" : [ 
 
      "userID1", 
 
      "userID2", 
 
      "userID3" 
 
     ], 
 
     "comments" : [ 
 
      { 
 
       "comment" : "Yes Should be....", 
 
       "userId" : "a3123", 
 
       "likes" : [ 
 
          "userID1", 
 
          "userID2", 
 
          "userID3" // How to write query to add this element. 
 
         ] 
 
      }, 
 
      { 
 
       "comment" : "No Should not be....", 
 
       "userId" : "ahh21", 
 
       "likes" : [ 
 
          "userID1", 
 
          "userID2", 
 
          "userID3" 
 
         ] 
 
      } 
 
     ] 
 
    }

請提供查詢以添加評論中顯示的元素。 謝謝。

回答

8

兩種可能性在這裏:

  1. 既然你沒有對意見的唯一標識符,更新的評論陣列上的特定項目的唯一途徑是明確表示要更新的指數,像這樣:

    db.documents.update(
        { _id: "iL9hL2hLauoSimtkM"}, 
        { $push: { "comments.0.likes": "userID3" }} 
    ); 
    
  2. 如果您的意見添加一個唯一的標識符,你可以搜索並更新匹配的項目,沒有與指數令人擔憂:

    db.documents.update(
        { _id: "iL9hL2hLauoSimtkM", "comments._id": "id1"}, 
        { $push: { "comments.$.likes": "userID3" }} 
    ); 
    
+1

謝謝您的重播,查詢工作效果很好。 –

+1

真棒!乾淨和簡單的 –

+0

只是想知道是否有可能用一次更新更新多個數組項目?我有一個情況,每個文檔最多可以有50個更新。 –

1

您可以嘗試$addToSet,只有在數組中尚不存在元素的情況下,纔會將元素添加到數組中。

db.topics.update(
    { _id: "iL9hL2hLauoSimtkM" }, 
    { $addToSet: { "comments.0.likes": "userId3" } } 
)