1

我有一个模式,它有一个名为ownerId的字段和一个名为participantIds. 在前端用户可以选择参与者。我正在使用这些 id 来过滤文档,方法是participantIds使用$all运算符和来自前端的参与者 ID 列表进行查询。这是完美的,只是participantsIds文档中不包含ownerId. 我考虑过使用聚合来添加一个新字段,该字段由这样一个列表组成:[participantIds, ownerId]然后查询这个新字段,$all然后再次删除该字段,因为前端不需要它。

这样的查询会是什么样子,或者有没有更好的方法来实现这种行为?我现在真的很迷茫,因为我在过去 3 个小时里试图用 mongo_dart 来实现它。

这是架构的样子:

{
    _id: ObjectId(),
    title: 'Title of the Event',
    startDate: '2020-09-09T00:00:00.000',
    endDate: '2020-09-09T00:00:00.000',
    startHour: 1,
    durationHours: 1,
    ownerId: '5f57ff55202b0e00065fbd10',
    participantsIds: ['5f57ff55202b0e00065fbd14', '5f57ff55202b0e00065fbd15', '5f57ff55202b0e00065fbd13'],
    classesIds: [],
    categoriesIds: [],
    roomsIds: [],
    creationTime: '2020-09-10T16:42:14.966',
    description: 'Some Desc'
}

Tl; dr 我想用字段上的$all运算符查询文档,应该包含在此查询中。participantsIdsownerId

我想要的是而不是查询:

participantsIds: ['5f57ff55202b0e00065fbd14', '5f57ff55202b0e00065fbd15', '5f57ff55202b0e00065fbd13']

我想查询:

participantsIds: ['5f57ff55202b0e00065fbd14', '5f57ff55202b0e00065fbd15', '5f57ff55202b0e00065fbd13', '5f57ff55202b0e00065fbd10']
4

3 回答 3

1

顺便说一句,在这里玩得开心,如果您经常进行查询,最好使用乔回答,或者在插入时使用“全部”字段更好。

附加说明:在开始/结束时使用投影,以获得您需要的内容

https://mongoplayground.net/p/UP_-IUGenGp

db.collection.aggregate([
  {
    "$addFields": {
      "all": {
        $setUnion: [
          "$participantsIds",
          [
            "$ownerId"
          ]
        ]
      }
    }
  },
  {
    $match: {
      all: {
        $all: [
          "5f57ff55202b0e00065fbd14",
          "5f57ff55202b0e00065fbd15",
          "5f57ff55202b0e00065fbd13",
          "5f57ff55202b0e00065fbd10"
        ]
      }
    }
  }
])
于 2020-09-18T02:44:11.393 回答
0

您可以使用更新的管道形式将所有者添加到参与者列表或添加新的合并字段:

db.collection.update({},[{$set:{
   allParticipantsIds: {$setUnion: [
        "$participantsIds",
        ["$ownerId"]
   ]}
}}])
于 2020-09-18T01:06:56.410 回答
0

不完全了解您想要做什么,但也许这会有所帮助:

db.collection.find({ 
  ownerId: "5f57ff55202b0e00065fbd10",
  participantsIds: { 
    $all: ['5f57ff55202b0e00065fbd14', 
           '5f57ff55202b0e00065fbd15', 
           '5f57ff55202b0e00065fbd13']
  })

于 2020-09-18T00:39:29.820 回答