【问题标题】:MongoDB aggregation with nested array of objects property with dateMongoDB 聚合与嵌套的对象属性数组与日期
【发布时间】:2020-10-29 16:01:24
【问题描述】:

我有类似这样的数据

{
  "_id": ObjectId("52ed12c144aecc4bf004d0b6"),
  "active": true,
  "name": "woslo",
 "specialDays": [
  {
  "_id": ObjectId("5f0576196198a715b0a72c14")
  "status": true
  "date": 2020-07-08T04:00:00.000+00:00
  },
  {
  "_id": ObjectId("5f05a3726198a715b0a72c94")
  "status": false
  "date": 2020-07-09T04:00:00.000+00:00
  }
 ]
}

我想使用这个查询来获取记录

   db.serviceProviders.aggregate([
    {
      $match: {
            specialDays: {
              $elemMatch: {
                $or: [
                  {
                    $and: [
                      {
                        date:  model.date // 2020-07-09T06:00:00.000Z
                      },
                      {
                        status: true
                      }
                    ]
                  },
                  {
                    date: {
                      $ne:  model.date //2020-07-09T06:00:00.000Z
                    }
                  }
                ]
              }
            }
          }
        }
  ]);

场景是:如果 date 存在于 specialDays 数组中并且状态应该为 true ,或者 date 不应该在 specialDays 对象的数组中,则获取此记录。 但是每次它获取高于甚至状态的相同记录时为假或日期存在于数组中。 请您帮我解决一下,我用 ISODate('2020-07-08') 在 Mongo compass 聚合中尝试了很多查询,但仍然无法正常工作。 谢谢 快乐编码。

【问题讨论】:

    标签: javascript mongodb date mongoose aggregation-framework


    【解决方案1】:

    问题在于您的$ne 条件。如果状态为假,那么您的$ne 条件为真。因为它是逻辑或,所以你得到了输出。

    this怎么样?

    db.collection.aggregate([
      {
        $match: {
          specialDays: {
            $elemMatch: {
              $or: [
                {
                  $and: [
                    {
                      date: new Date("2020-07-09T04:00:00.000+00:00")
                    },
                    {
                      status: true
                    }
                  ]
                },
                {
                  date: {//Changes here
                    $gte: new Date("2020-07-09T06:00:00.000+00:00"),
                    $lte: new Date("2020-07-09T23:59:59.000+00:00")
                  }
                }
              ]
            }
          }
        }
      }
    ])
    

    this

    $ne 条件的另一个原因是 true,因为它满足 specialDays 数组中的第一个数组元素

    db.collection.aggregate([
      {
        $match: {
          specialDays: {
            $elemMatch: {
              $or: [
                {
                  $and: [
                    {
                      date: new Date("2020-07-09T04:00:00.000+00:00")
                    },
                    {
                      status: true
                    }
                  ]
                },
                {
                  $and: [
                    {
                      date: {
                        $ne: new Date("2020-07-09T04:00:00.000+00:00")
                      }
                    },
                    {
                      status: false
                    }
                  ]
                }
              ]
            }
          }
        }
      }
    ])
    

    【讨论】:

    • 太好了,谢谢你 :),它解决了我的问题。
    • 很高兴,它有帮助。快乐编码@TanzeelSaleem
    猜你喜欢
    • 2021-12-31
    • 2020-07-02
    • 1970-01-01
    • 2020-04-23
    • 2014-05-25
    • 2020-01-24
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    相关资源
    最近更新 更多