【问题标题】:mongoose node.js, query with $lt and $gt not workingmongoose node.js,使用 $lt 和 $gt 查询不起作用
【发布时间】:2011-08-03 10:26:22
【问题描述】:

我想获取最后分数在 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}});

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

【问题讨论】:

    标签: mongodb node.js mongoose


    【解决方案1】:

    这是提示而不是答案。

    在使用 ma​​ngoose 时,对 $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();
    
            }
        });
    

    希望对你有所帮助。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

      • 我也在考虑朝这个方向发展,但不知道这是否正确。你说服了我 :) 非常感谢你的帮助。
      • @Luc:不要在意添加额外字段时,mongodb 非常适合非规范化(以及一般的任何文档数据库)。
      【解决方案3】:

      我认为它不起作用,因为 mongo 中的嵌入式集合是这样访问的: “marks.0.value”,虽然我没用过猫鼬。

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

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

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

      【讨论】:

      • 你知道有办法只获取标记的最后一个元素吗?
      猜你喜欢
      • 2017-02-08
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多