2013-10-29 40 views
3

這是我收集的樣子從文檔數組中刪除最低分數:無法在MongoDB中

db.students.find({_id:100}).pretty() 
{ 
    "_id" : 100, 
    "name" : "Demarcus Audette", 
    "scores" : [ 
     { 
      "type" : "exam", 
      "score" : 30.61740640636871 
     }, 
     { 
      "type" : "quiz", 
      "score" : 14.23233821353732 
     }, 
     { 
      "type" : "homework", 
      "score" : 31.41421298576332 
     }, 
     { 
      "type" : "homework", 
      "score" : 30.09304792394713 
     } 
    ] 
} 

我執行以下2個查詢在蒙戈外殼:

x=db.students.aggregate([{ "$unwind":"$scores" },{"$match":{"scores.type":"homework"}},{ "$group":{"_id":"$_id","minscore":{"$min":"$scores.score" }}} ]) 

和未來一個是:

for (var a in x["a"]) { db.students.update({ "_id":a["_id"] },{"$pull":{"scores":{"score":a["minscore"]}}}) } 

我能夠看到最低分數列表,但是當我執行第二個查詢時似乎沒有任何東西刪除。我知道有一個邏輯錯誤。我試圖在這裏閱讀帖子,但我無法通過它。我只是想知道我哪裏錯了。

+1

這是第4周的MongoDB for java開發者課程的作業! –

回答

0

這是因爲當你這樣做:

x = db.students.aggregate([ 
    { "$unwind":"$scores" }, 
    {"$match":{ 
    "scores.type":"homework" 
    }}, 
    { 
    "$group":{ 
     "_id":"$_id", 
     "minscore":{"$min":"$scores.score" }} 
    } 
]); 

你的結果是形式:

{ 
    result : [{ 
    "_id" : 100, 
    "minscore" : 30.09304792394713 
    }], 
    ok : 1 
} 

所以沒有x["a"]那裏,你需要寫x['result']

P.S.如果你正在做功課題,你應該寫一下。

+1

你試過這個代碼嗎?有很多事情在那裏是錯誤的,只是將「一」改爲「結果」不會使它工作。 –

3

您的for循環中有幾個問題 - 儘管您的聚合看起來不錯。

您的結果文檔「x」包含數組字段「result」。你想迭代該數組中的文檔。您所擁有的for循環語法不會將數組中的值設置爲數組中的值,而是將其設置爲數組中的索引。更好,更清晰的將是使用forEach循環語法:

x.result.forEach(function(doc) { 
    db.students.update({ "_id": doc._id }, 
         { "$pull": { "scores" : { 
              "score":doc.minscore, 
              "type":"homework" 
         } } } 
    ); 
}); 

你的更新語句也不十分準確 - 你要確保你拉只有功課得分最低 - 如果有什麼相同的學生有單一的考試,也是他們的最低功課相同的分數?您的語法將拉出所有分數與minscore相等的子文檔!

這是一個很容易解決的問題(並且我向您展示您需要使用的語法來只提取作業子文檔),但請記住$pull will pull all values匹配查詢,並且如果只有一個作業,那麼它是minscore和它將被拉。如果有兩個作業分數但他們是平等的,他們將被拉!需要考慮的事情。

+2

x.result未定義,代碼在循環爲x.foreach時起作用.... –

+0

此答案在MongoDB 2.4天后返回 - 聚集返回單個文檔,其中包含一個數組的字段結果。 –

2

使用下面的代碼刪除最低分。聚合代碼是可以的。

x=db.students.aggregate([{ "$unwind":"$scores" },{"$match":{"scores.type":"homework"}},{ "$group":{"_id":"$_id","minscore":{"$min":"$scores.score" }}} ]); 

var doc = myCursor.hasNext() ? x.next() : null; 

x.forEach(function(doc) {db.students.update({ "_id": doc._id }, { "$pull": { "scores" : { 
"score":doc.minscore, "type":"homework"} } }); 

在MongoShell運行上述代碼之後 - db.students.find.pretty(); 您將得到記錄,類似這樣的文件 -

{ 
    "_id" : 100, 
    "name" : "Demarcus Audette", 
    "scores" : [ 
     { 
      "type" : "exam", 
      "score" : 30.61740640636871 
     }, 
     { 
      "type" : "quiz", 
      "score" : 14.23233821353732 
     }, 
     { 
      "type" : "homework", 
      "score" : 31.41421298576332 
     }, 
    ] 
} 

得分最低的類型:「功課」將被從每一個記錄集刪除。

+1

在上面的代碼中有一個錯字:行:var doc = myCursor.hasNext()? x.next():null;應該閱讀:var doc = x.hasNext()? x.next():null; –

+1

line var doc = myCursor.hasNext()? x.next():null;不需要刪除它並且代碼可以工作 –

+0

解決方案中存在一些拼寫錯誤和語法錯誤。請使用以下聲明。 var x = db.students.aggregate([{「$ unwind」:「$ scores」},{「$ match」:{「scores.type」:「homework」}},{「$ group」:{ _id「:」$ _ id「,」minscore「:{」$ min「:」$ scores.score「}}}]); var doc = x.hasNext()? x.next():null; x.forEach(function(doc){ \t db.students.update({「_id」:doc._id},{「$ pull」:{「scores」:{「score」:doc.minscore,「鍵入「:」homework「}}}); }); – raok1997

0

這是一個與我合作的答案,基於其他答案的組合。

x = db.students.aggregate([ 
    { "$unwind":"$scores" }, 
    {"$match":{ 
    "scores.type":"homework" 
    }}, 
    { 
    "$group":{ 
     "_id":"$_id", 
     "minscore":{"$min":"$scores.score" }} 
    } 
]); 



x.result.forEach(function(doc) {db.students.update({ "_id": doc._id },       { "$pull": { "scores" : { 
       "score":doc.minscore,"type":"homework" } } }); }); 
0

以下代碼適用於我。

var x=db.students.aggregate([{ "$unwind":"$scores" },{"$match":{"scores.type":"homework"}},{"$group":{"_id":"$_id","minscore":{"$min":"$scores.score" }}} ]); 

var doc = x.hasNext() ? x.next() : null; 

x.forEach(function(doc){ 
    db.students.update({ "_id": doc._id }, { "$pull": { "scores" : { "score":doc.minscore, "type":"homework"} } }); 
});