mongoose Mongo聚合框架与给定ID匹配

oxf4rvwz  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(117)

我的模型:

const scheduleTaskSchema = new Schema({
  activity: { type: Object, required: true },
  date: { type: Date, required: true },
  crew: Object,
  vehicle: Object,
  pickups: Array,
  details: String,
});
const ScheduleTaskModel =  mongoose.model("schedule_task", scheduleTaskSchema),

以及该聚合管道:

let aggregation = [
    {
      $sort: {
        "pickups.0.time": 1,
      },
    },
    {
      $group: {
        _id: "$date",
        tasks: { $push: "$$ROOT" },
      },
    },
    { $sort: { _id: -1 } },
  ];


  if (hasDateQuery) {
    aggregation.unshift({
      $match: {
        date: { $gte: new Date(start_date), $lte: new Date(end_date) },
      },
    });
  } else {
    aggregation.push({ $limit: 2 });
  }

  const scheduledTasksGroups = await ScheduleTaskModel.aggregate(aggregation);

crew对象可以具有任意数量键,其结构如下:

crew : {
  drivers: [
    {
      _id: "656b1e9cf5b894a4f2v643bc",
      name: "john"
    },
    {
      _id: "567b1e9cf5b954a4f2c643bhh",
      name: "bill"
    }
  ],
  officers: [
    {
      _id: "655b1e9cf5b6632a4f2c643jk",
      name: "mark"
    },
    {
      _id: "876b1e9af5b664a4f2c234bb",
      name: "jane"
    }
  ],
  //...any number of keys that contain an array of objects that all have an _id
}

我正在寻找一种方法,在不知道要搜索哪个键的情况下,返回包含crew对象中任何位置的给定_id的所有文档(在排序/分组之前),它可以是许多不同的键,这些键都包含一个对象数组,这些对象都具有_id
有什么想法吗?

qlfbtfca

qlfbtfca1#

您可以使用$objectToArray执行以下操作:

db.collection.aggregate([
  {$addFields: {crewFilter: {$objectToArray: "$crew"}}},
  {$set: {
      crewFilter: {$size: {
          $reduce: {
            input: "$crewFilter",
            initialValue: [],
            in: {$concatArrays: [
                "$$value",
                {$filter: {
                    input: "$$this.v",
                    as: "member",
                    cond: {$eq: ["$$member._id", _id]}
                  }
                }
              ]
            }
          }
      }}
  }},
  {$match: {crewFilter: {$gt: 0}}}
])

了解它在playground example上的工作原理

相关问题