mongoose node.js,用$ lt和$ gt查询不起作用

我想要得到最后一个标记在15到20之间的所有学生。为此,我使用mongoose在我的mongoDB中执行以下查询:模型工作正常(所有其他查询都可以)。

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

这是行不通的,有没有我错过的东西?

*更新*

我发现像这样的东西:

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

但是这也行不通。 有没有办法在这种情况下得到marks数组的最后一个标记?

让我们考虑你的Pupils集合:

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

我build议将最新的标记添加到瞳孔文档中(正如您可以在上面的文档中看到的那样),并且每次将新标记添加到嵌套集合中时都进行更新。 那么你将能够像这样查询它:

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

你也可以使用$ where查询最新的标记,但要小心,因为:

JavaScript比本地运营商执行速度更慢,但是非常灵活

我相信这不起作用,因为mongo中的embedded式集合是这样访问的:“marks.0.value”,尽pipe我没有使用mongoose。

不幸的是你的情况,我不认为有一种方法来使用负面的索引。 (尽pipe如此,除非你使用封顶的集合,否则Mongo不保证自然顺序的保留)

您可以使用Map / Reduce或组命令来完成此操作

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

这是一个答案而不是答案。

使用双引号的特殊关键词,如$ elemMatch,$ get,$ lt等,同时使用芒果

在以下代码中,$ 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(); } }); 

我希望这会有帮助。