2014-10-30 59 views
0

所以我需要從集合中刪除最低的hw分數。我在沒有錯誤的情況下在mongoShell中運行它。但是寫入結果只能匹配但不能修改。有人可以告訴我爲什麼嗎?更新方法無誤地運行,但結果沒有更新

這裏是數據庫:

db.students.find({ _id : 137 }).pretty() 
{ 
    "_id" : 137, 
    "name" : "Tamika Schildgen", 
    "scores" : [ 
     { 
      "type" : "exam", 
      "score" : 4.433956226109692 
     }, 
     { 
      "type" : "quiz", 
      "score" : 65.50313785402548 
     }, 
     { 
      "type" : "homework", 
      "score" : 89.5950384993947 
     } 
    ] 
} 

下面是我的解決辦法:

// sort by lowest score; writeresults are modified. 
db.students.update(
    {"scores.type":"homework"}, 
    {$push: {"scores": { $each: [], $sort: { score: 1} }}}, 
    {multi: true} 
)  

// should remove last element of homework; writeresults are not modified, not sure why 
db.students.update(
    {"scores.type":"homework"}, 
    {$pop: { score: -1 }}, 
    {multi: true} 
) 
// Alternatively, below query also generated same writeresults 
db.students.update(
    {}, 
    {$pull: { "scores": {$elemMatch: {"type": "homework"} }}}, 
    {multi: true} 
) 
+0

你想'scores'在'$ pop',不'score'。 – wdberkeley 2014-10-31 15:58:46

+0

@wdberkeley謝謝!這很有道理,刪除數組中的元素而不是文檔。 '$ pull'怎麼樣,爲什麼它不起作用? – 2014-11-02 16:40:28

回答

0

據MongoDB的文檔,這是你應該如何更新嵌入文檔。

更新嵌入式文檔使用多個字段匹配

$操作者可以更新匹配與$elemMatch()操作者指定的多個查詢條件的第一個數組元素。

考慮students集合,其grades字段值在以下文件是嵌入文檔的數組:

{ 
    _id: 4, 
    grades: [ 
    { grade: 80, mean: 75, std: 8 }, 
    { grade: 85, mean: 90, std: 5 }, 
    { grade: 90, mean: 85, std: 3 } 
    ] 
} 

在下面的例子中,$操作者更新std字段的值與第一嵌入的文檔中具有grade字段具有值less than or equal to 90 and a mean field with a value greater than 80

db.students.update(
    { 
    _id: 4, 
    grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } } 
    }, 
    { $set: { "grades.$.std" : 6 } } 
) 

該操作更新第一嵌入d ocument匹配條件,即第二嵌入文檔數組中:

{ 
    _id: 4, 
    grades: [ 
    { grade: 80, mean: 75, std: 8 }, 
    { grade: 85, mean: 90, std: 6 }, 
    { grade: 90, mean: 85, std: 3 } 
    ] 
} 
+0

感謝您的回覆。但是這個查詢也不起作用。請參閱我上面的編輯。 – 2014-10-30 18:55:34