【问题标题】:How to build a MongoDB query that combines two field temporarily?如何构建一个临时组合两个字段的MongoDB查询?
【发布时间】:2020-09-17 22:14:33
【问题描述】:

我有一个架构,它有一个名为ownerId 的字段和一个名为participantIds 的数组字段。在前端用户可以选择参与者。我使用这些 id 来过滤文档,方法是使用 $all 运算符查询 participantIds 和来自前端的参与者 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 我想在participantsIds 字段上使用$all 运算符查询文档但 ownerId 应该包含在此查询中。

我想要的不是查询:

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

我想查询:

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

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework mongo-dart


    【解决方案1】:

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

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

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

    db.collection.aggregate([
      {
        "$addFields": {
          "all": {
            $setUnion: [
              "$participantsIds",
              [
                "$ownerId"
              ]
            ]
          }
        }
      },
      {
        $match: {
          all: {
            $all: [
              "5f57ff55202b0e00065fbd14",
              "5f57ff55202b0e00065fbd15",
              "5f57ff55202b0e00065fbd13",
              "5f57ff55202b0e00065fbd10"
            ]
          }
        }
      }
    ])
    

    【讨论】:

      【解决方案2】:

      没有完全理解你想要做什么,但也许这会有所帮助:

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

      【讨论】:

      • 已编辑问题我希望现在更准确。
      【解决方案3】:

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

      db.collection.update({},[{$set:{
         allParticipantsIds: {$setUnion: [
              "$participantsIds",
              ["$ownerId"]
         ]}
      }}])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-25
        • 1970-01-01
        • 2020-04-13
        • 1970-01-01
        • 1970-01-01
        • 2016-07-27
        • 2021-09-28
        相关资源
        最近更新 更多