3

我想得到最后一个分数在 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}});

但这也不起作用。在这种情况下,有没有办法获得标记数组的最后一个标记?

4

3 回答 3

5

让我们考虑一下您的Pupils收藏:

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

我建议在 Pupil 文档中添加最新标记(如您在上面的文档中所见),并在每次将新标记添加到嵌套集合时更新它。然后你就可以像这样查询它:

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

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

Javascript 的执行速度比本地运算符慢,但非常灵活

于 2011-04-12T10:17:16.043 回答
0

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

不幸的是,对于您的情况,我认为没有办法使用负索引。(Mongo 不保证保留自然顺序,除非您无论如何都使用有上限的集合)

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

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

于 2011-04-11T22:35:36.137 回答
-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();

        }
    });

我希望它会有所帮助。

于 2015-11-18T09:35:46.520 回答