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

时间:2011-04-11 21:53:00

标签: mongodb node.js mongoose

我希望得到最后一个标记在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}});

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

3 个答案:

答案 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或组命令

来完成此操作

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

答案 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();

        }
    });

我希望它会有所帮助。