2011-04-11 43 views
2

我想獲取所有最後一個標記在15和20之間的學生。爲此,我使用mongoose在我的mongoDB中執行以下查詢: 模型工作正常(所有其他查詢都可以)。

Pupils.find({"marks[-1].value": {'$lt' : 20 }, "marks[-1].value" : { '$gt' : 15 }}, function(err, things){ 

這是行不通的,有什麼我錯過了?

* UPDATE *

我發現是這樣的:

Pupils.find({ "marks[-1].value": {$gt : 15, $lt : 20}}); 

但是,這也不行。有沒有辦法在這種情況下獲得marks數組的最後一個標記?

回答

4

讓我們考慮您的Pupils集合:

Pupils 
{ 
    _id, 
    Marks(integer), 
    LatestMark(int) 
} 

我建議最新的標記添加到瞳孔文件(你可以在上面的文件看到),而當你添加新的標誌,形成嵌套收集每一次更新。 然後,你將能夠在其查詢像這樣:

db.Pupils.find({ "LatestMark": {$gt : 15, $lt : 20}}); 

您也可以使用$where查詢最新的標誌,但要小心,因爲:

的Javascript比 本地運營商執行比較慢,但是非常靈活的

+0

我也在考慮朝這個方向前進,但並不知道這是否正確。你說服了我:)非常感謝你的幫助。 – Luc 2011-04-12 10:46:46

+0

@Luc:添加額外的字段時不必在意,mongodb完全適合反規範化(以及一般的任何文檔數據庫)。 – 2011-04-12 11:22:06

0

我相信它不工作,因爲mongo中的嵌入式集合是這樣訪問的: 「marks.0.value」,雖然我沒有使用貓鼬。

不幸的是,您的情況下,我不認爲有一種方法來使用否定索引。 (蒙戈不保證保留自然順序,除非你使用加蓋收集反正雖然)

您可能能夠做到這一點使用的Map/Reduce或一組命令

http://www.mongodb.org/display/DOCS/MapReduce

+0

你有沒有辦法只獲得標記的最後一個元素? – Luc 2011-04-12 07:11:27

-1

這是比答案小費。

使用LT等類似$ elemMatch,$ GET,$特殊關鍵詞雙引號,而使用mangoose

在下面的代碼中,$ gt將不能正常工作

var elmatch = { companyname: mycompany }; 
    var condition = { company_info: { $elemMatch: elmatch } }; 

    if(isValid(last_id)){ 
     condition._id = { $gt: new ObjectId(last_id) }; 
    } 
    console.log(condition); 

    User.find(condition).limit(limit).sort({_id: 1}).exec(function (err, lists) { 
     if (!err) { 
      res.send(lists); 
      res.end(); 
     }else{ 
      res.send(err); 
      res.end(); 

     } 
    }); 

但這問題是,當我使用雙引號特殊關鍵字

var elmatch = { companyname: mycompany }; 
    var condition = { company_info: { "$elemMatch": elmatch } }; 

    if(isValid(last_id)){ 
     condition._id = { "$gt": new ObjectId(last_id) }; 
    } 
    console.log(condition); 

    User.find(condition).limit(limit).sort({_id: 1}).exec(function (err, lists) { 
     if (!err) { 
      res.send(lists); 
      res.end(); 
     }else{ 
      res.send(err); 
      res.end(); 

     } 
    }); 

我希望這將有助於解決