使用父文档和数组中的嵌套文档进行MongoDB条件搜索

假设我有一个像这样的mongodb“ schema”:

offers: Schema = {
      name: String,validityStart: Date,validityEnd: Date,customized: [
         {
            validityStart: Date,user: String
         }
     ]
}

按词:这里有一个要约集合,在由validationStart和validityEnd指定的日期之间有效。每个报价都有一个子数组,该子数组定义用户可以“定制”此报价,即使用时间更长。

我可以查询所有可用的报价

Offer.find({ $and: [{ validityStart: { $lte: today } },{ validityEnd: { $gte: today } }] })

但是如果提供了“ 用户”,我需要创建一个查询,以显示所有报价并通过用户字段进行过滤以显示“定制的”报价。

一个显示我想要实现的目标的例子是:想象一下12月有一些报价

[
    {
      name: "Soccer Game 2020",validityStart: "2019-12-1",validityEnd: "2019-12-31"
    },{
      name: "Golf Equipment",validityEnd: "2019-12-31"
    }
]

但是我让用户FOO成为足球比赛1个月的早鸟,我将拥有:

[
    {
      name: "Soccer Game 2020",validityEnd: "2019-12-31",customized:[
        {
           validityStart: "2019-11-1",validityEnd: "2019-11-30",user: "FOO"
        }
      ]
    },---
]

如何为所有用户返回“父”日期,但对于由定制数组指定的某些用户,返回其各自的日期呢?喜欢:

[
    {
      name: "Soccer Game 2020",validityStart: "2019-11-1",validityEnd: "2019-11-30"
    },validityEnd: "2019-12-31"
    }
]

我不知道如何创建这样的查询。

我可以更改架构,我处于开发的早期阶段,所以这不是问题。

guoqia 回答:使用父文档和数组中的嵌套文档进行MongoDB条件搜索

这比我想要的解决方案要冗长一些,但是可以完成工作。 此外,如果它们当前是字符串,则建议仅将日期存储为文档中的 date对象

查询:

db.collection.aggregate([
  {
    $addFields: {
      userCustomOffer: {
        $filter: {
          input: "$customized",as: "elem",cond: {
            $eq: ["$$elem.user","FOO"]
          }
        }
      }
    }
  },{
    $project: {
      name: 1,validityStart: {
        $cond: {
          if: {
            $or: [
              {
                $eq: ["$userCustomOffer",[]]
              },{
                $eq: ["$userCustomOffer",null]
              }
            ]
          },then: "$validityStart",else: {
            $arrayElemAt: ["$userCustomOffer.validityStart",0]
          }
        }
      },validityEnd: {
        $cond: {
          if: {
            $or: [
              {
                $eq: ["$userCustomOffer",then: "$validityEnd",else: {
            $arrayElemAt: ["$userCustomOffer.validityEnd",0]
          }
        }
      }
    }
  }
]);

作为用例的示例文档:

[
  {
    name: "Soccer Game 2020",validityStart: "2019-12-1",validityEnd: "2019-12-31",customized: [
      {
        validityStart: "2019-11-1",validityEnd: "2019-11-30",user: "FOO"
      },{
        validityStart: "2019-10-1",validityEnd: "2019-10-31",user: "BAZ"
      }
    ]
  },{
    name: "Golf Equipment",user: "BAR"
      }
    ]
  },{
    name: "Hockey Kit",validityStart: "2019-01-1",validityEnd: "2019-02-28"
  }
]

查询结果:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),"name": "Soccer Game 2020","validityEnd": "2019-11-30","validityStart": "2019-11-1"
  },{
    "_id": ObjectId("5a934e000102030405000001"),"name": "Golf Equipment","validityEnd": "2019-12-31","validityStart": "2019-12-1"
  },{
    "_id": ObjectId("5a934e000102030405000002"),"name": "Hockey Kit","validityEnd": "2019-02-28","validityStart": "2019-01-1"
  }
]
本文链接:https://www.f2er.com/3143103.html

大家都在问