【问题标题】:Mongodb search field with range inside array of object对象数组内具有范围的Mongodb搜索字段
【发布时间】:2021-09-30 10:23:06
【问题描述】:

我在这样的集合中有多个文档

[
  {
    _id: 123,
    data: 1,
    details: [
      {
        item: "a",
        day: 1
      },
      {
        item: "a",
        day: 2
      },
      {
        item: "a",
        day: 3
      },
      {
        item: "a",
        day: 4
      }
    ],
    someMoreField: "xyz"
  }
]

现在我想要 _id: 123 和 details 字段的文档应该只包含 1 到 3 范围内的日期。所以结果将如下所示。

{
    _id: 123,
    data: 1,
    details: [
        {
            item: 'a',
            day: 1,
        },
        {
            item: 'a',
            day: 2,
        },
        {
            item: 'a',
            day: 3,
        },
    ],
    someMoreField: 'xyz',
};

我尝试通过聚合查询来做到这一点:

db.collectionaggregate([
      {
        $match: {
          _id: id,
          'details.day': { $gt: 1, $lte: 3 },
        },
      },
      {
        $project: {
          _id: 1,
          details: {
            $filter: {
              input: '$details',
              as: 'value',
              cond: {
                $and: [
                  { $gt: ['$$value.date', 1] },
                  { $lt: ['$$value.date', 3] },
                ],
              },
            },
          },
        },
      },
    ])

但这给了我空的结果。有人可以指导我完成这个吗?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    你已经很接近了,你只需要把$gt改成$gte$lt改成$lte

    另一个小的语法错误是您正在访问$$value.date,但您提供的架构没有该字段,看来您需要将其更改为$$value.day,如下所示:

    db.collection.aggregate([
      {
        $match: {
          _id: 123,
          "details.day": {
            $gt: 1,
            $lte: 3
          }
        }
      },
      {
        $project: {
          _id: 1,
          details: {
            $filter: {
              input: "$details",
              as: "value",
              cond: {
                $and: [
                  {
                    $gte: [
                      "$$value.day",
                      1
                    ]
                  },
                  {
                    $lte: [
                      "$$value.day",
                      3
                    ]
                  },
                  
                ],
                
              },
              
            },
            
          },
          
        },
        
      },
    ])
    

    Mongo Playground

    【讨论】:

    • 感谢您指出错误。这只返回`id`和details字段。如果我想要文档中的所有其他字段,要添加什么?
    • 使用$addFields 而不是$project。 (然后从中删除_id
    猜你喜欢
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2016-08-03
    • 2021-05-26
    • 2019-01-10
    • 2022-10-02
    • 1970-01-01
    相关资源
    最近更新 更多