我希望得到最后一个标记在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}});
但这也不起作用。在这种情况下,有没有办法获得标记数组的最后一个标记?
答案 0 :(得分:5)
让我们考虑一下您的Pupils
集合:
Pupils
{
_id,
Marks(integer),
LatestMark(int)
}
我建议在Pupil文档中添加最新标记(正如您在上面的文档中看到的那样),并在每次向嵌套集合添加新标记时更新它。 然后你就可以这样查询:
db.Pupils.find({ "LatestMark": {$gt : 15, $lt : 20}});
您也可以使用$where查询最新商标,但请注意:
Javascript的执行速度比 本地运营商,但非常灵活
答案 1 :(得分:0)
我认为它不起作用,因为mongo中的嵌入式集合是这样访问的: “marks.0.value”,虽然我没有使用过mongoose。
不幸的是,对于您的方案,我认为没有办法使用否定索引。 (Mongo并不保证保留自然顺序,除非您使用上限集合,但是)
您可以使用Map / Reduce或组命令
来完成此操作答案 2 :(得分:-1)
这是答案而非答案。
在使用 mangoose 时,使用双引号作为 $ 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();
}
});
我希望它会有所帮助。