2014-10-30 57 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