2011-04-11 97 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(); 

     } 
    }); 

我希望这将有助于解决