2014-03-26 31 views
0

以前的答案(從2013年中和之前)似乎不起作用,鏈接到文檔都是過時的。在MongoDB中修改數組中的文檔

實施例的用戶對象:

{ 
    "name": "Joe Bloggs", 
    "email": "[email protected]", 
    "workstations" : [ 
         { "number" : "10001", 
          "nickname" : "home" }, 
         { "number" : "10002", 
          "nickname" : "work" }, 
         { "number" : "10003", 
          "nickname" : "vacation" } 
        ] 
} 

如何可以修改工作站的綽號?

我試過使用$set,workstations.$workstations.nickname但沒有給出所需的結果。

回答

1

簡而言之,你必須使用數組索引。例如,要更新的10002綽號:{$set:{"workstations.1.nickname":"newnickname"}}

下面是完整的例子:

> db.test.update({"_id" : ObjectId("5332b7cf4761549fb7e1e72f")},{$set:{"workstations.1.nickname":"newnickname"}}) 
> db.test.findOne() 
{ 
     "_id" : ObjectId("5332b7cf4761549fb7e1e72f"), 
     "email" : "[email protected]", 
     "name" : "Joe Bloggs", 
     "workstations" : [ 
       { 
         "number" : "10001", 
         "nickname" : "home" 
       }, 
       { 
         "nickname" : "newnickname", 
         "number" : "10002" 
       }, 
       { 
         "number" : "10003", 
         "nickname" : "vacation" 
       } 
     ] 
} 
> 

如果你不知道指數(工作站的位置),您可以更新文檔使用$elemMatch

>db.test.update(
    { 
     "email": "[email protected]", 
     "workstations": { "$elemMatch" { "number" : "10002" } } 
    }, 
    { 
     "$set": { "workstations.$.nickname": "newnickname2" } 
    } 
) 
> 
+0

感謝將標記爲答案,是否有任何方式使用工作站號碼獲取數組索引? – user2652341

+0

@ user2652341更新了答案。 – 2014-03-26 11:46:52

+0

@ user2652341絕對。只要改變你的比賽中使用的領域。因此,在'$ elemMatch'內使用「數字」字段。 '$ elemMatch'就在那裏,因爲你有*可能性*匹配*各種*記錄* *有這個值。所以具體一點。這就是我想說的。 –

1

@ naimdjon的答案會工作。一概而論,你可以結合使用$elemMatch運營商與$ positional操作使用下面的查詢數組中更新一個元素

db.test.update({ 
    // Find the document where name="Joe Bloggs" and the element in the workstations array where number = "10002" 
    "name": "Joe Bloggs", 
    "workstations":{$elemMatch:{"number":"10002"}} 
}, 
{ 
    // Update the nickname in the element matched 
    $set:{"workstations.$.nickname":"newnickname"} 
}) 

注意:如果你需要匹配更多 $ elemMatch只需要而不是陣列中的一個組件。如果你打算在number上匹配,你可以使用"workstations.number":"10002"

+0

謝謝你,這正是我所尋找的。 – user2652341

1

只要你知道你希望更新哪個條目,那麼positional $運算符就可以提供幫助。但你需要更新你的查詢表格:

db.collection.update(
    { 
     "email": "[email protected]", 
     "workstations": { "$elemMatch" { "nickname" : "work" } } 
    }, 
    { 
     "$set": { "workstations.$.nickname": "new name" } 
    } 
) 

所以這是一般的形式。你在這裏做的需要是「匹配」在數組中的東西,以獲得一個「位置」用於更新。

或者,當你知道的位置,那麼你可以「指定」與「點號」的位置:

db.collection.update(
    { 
     "email": "[email protected]", 
    }, 
    { 
     "$set": { "workstations.1.nickname": "new name" } 
    } 
) 

哪些更新數組中的第二元素,並且不需要查詢中的「匹配」部分。

+0

感謝解釋會upvote,但不能。 – user2652341

相關問題