【问题标题】:How can I write a Mongoose find query that uses another field as it's conditional?如何编写使用另一个字段作为条件的 Mongoose 查找查询?
【发布时间】:2015-04-02 04:06:25
【问题描述】:

考虑以下几点:

我有一个名为“Person”的 Mongoose 模型。在 Person 模式的模式中,每个 Person 都有两个字段:“children”和“maximum_children”。这两个字段都是数字类型。

我想编写一个查找查询,当 Person 的“children”值小于它的“maximum_children”值时返回 Persons。

我试过了:

person_model.find({
    children: {
        $lt: maximum_children
    }
}, function (error, persons) {
    // DO SOMETHING ELSE
});

person_model.find({
    children: {
        $lt: 'maximum_children'
    }
}, function (error, persons) {
    // DO SOMETHING ELSE
});

我在尝试指定要比较“孩子”的字段名称时做错了。

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    好的。

    在我发布此问题后,我找到了解决方案。

    答案似乎是:

    person_model.find({
        $where: "children < maximum_children"}, function (error, persons)
    }, {
        // DO SOMETHING ELSE
    });
    

    似乎工作正常,虽然看起来很乱。

    【讨论】:

      【解决方案2】:

      $where 必须针对每个文档有条件地执行其 JavaScript,因此其性能可能会很差。相反,您可以使用aggregate$project 阶段包含一个新字段,指示文档是否匹配,然后对其进行过滤:

      person_model.aggregate([
          {$project: {
              isMatch: {$lt: ['$children', '$maximum_children']},
              doc: '$$ROOT'
          }},
          {$match: {isMatch: true}},
          {$project: {_id: 0, doc: 1}}
      ], function(err, results) {...});
      

      这使用$$ROOT 将原始文档包含为投影的doc 字段,最后一个$project 用于删除添加的isMatch 字段。

      results 看起来像:

      {
          "doc" : {
              "_id" : ObjectId("54d04591257efd80c6965ada"),
              "children" : 5,
              "maximum_children" : 10
          }
      }, 
      {
          "doc" : {
              "_id" : ObjectId("54d04591257efd80c6965add"),
              "children" : 5,
              "maximum_children" : 6
          }
      }
      

      如果您想删除添加的对象的doc 级别,您可以在results 上使用Array#map,如下所示:

      results = results.map(function(item) { return item.doc; });
      

      重塑 results 以将它们恢复为原始形式:

      {
          "_id" : ObjectId("54d04591257efd80c6965ada"),
          "children" : 5,
          "maximum_children" : 10
      }, 
      {
          "_id" : ObjectId("54d04591257efd80c6965add"),
          "children" : 5,
          "maximum_children" : 6
      }
      

      【讨论】:

        猜你喜欢
        • 2017-10-08
        • 1970-01-01
        • 2020-04-24
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2017-03-26
        • 1970-01-01
        • 2020-06-19
        相关资源
        最近更新 更多