【问题标题】:MongoDB query double nested array with matching setsMongoDB查询具有匹配集的双嵌套数组
【发布时间】:2021-09-11 03:35:33
【问题描述】:

不熟悉 Mongo 并且仍在进步,我遇到了一个我无法解决的问题(而且我不知道这是否可行)

我有一个Event 文档,其结构如下:

{
    "_id": "6138451fb3a7d9564a0229fd"
    "title": "Event  1",
    "cohortsGroups": [
        [
          {
            "_id": "6124beef59d728c82088fd59",
            "name": "2022",
            "type": "promotion"
          }, 
          {
            "_id": "6124bf2159d728c82088fd60",
            "name": "Toronto",
            "type": "city"
          }
       ],
       [
         {
            "_id": "6124beef59d728c82088fd57",
            "name": "2024",
            "type": "promotion"
          },
          {
            "_id": "6124bf2159d728c82088fd68",
            "name": "Tokyo",
            "type": "city"
          }
        ],   
    ]
},
{
    "_id": "6138451fb3a7d9564a0229fe"
    "title": "Event 2",
    "cohortsGroups": [
        [
          {
            "_id": "6124beef59d728c82088fd59",
            "name": "2022",
            "type": "promotion"
          }
        ]
     ]
},
{
    "_id": "6138451fb3a7d9564a0229fh"
    "title": "Event 3",
    "cohortsGroups": [
        [
          {
            "_id": "6124beef59d728c82088fd21",
            "name": "2022",
            "type": "promotion"
          },
          {
            "_id": "6124beef59d728c82088fd43",
            "name": "Amsterdam",
            "type": "city"
          }
        ]
    ]
}

如您所见,cohortsGroups 字段是一个双精度对象数组。我想根据我的用户对象检索这些事件,该对象还拥有一个数组(简单)cohorts

例如,假设我的用户看起来像这样:

{
 "firstName": "John",
 "lastName": "Doe",
 "cohortsRef": [
   {
    "_id": "6124beef59d728c82088fd59",
    "name": "2022",
    "type": "promotion"
   },
   {
    "_id": "6124bf2159d728c82088fd60",
    "name": "Toronto",
    "type": "city"
   }
 ]
}

为了简单起见,我只想在他的cohortsGroups 中的一组cohorts 中的一个让他的同类群组都出现在用户对象中时检索一个事件。

考虑到这一点和上面的例子,我只能检索Event 1Event 2。 我无法检索Event 3,因为即使我的用户中有群组2022,它也与我的用户群组中不存在的群组Amsterdam配对,(eq:所有群组子数组都没有值完全存在于我用户的同类群组中)。

我真的希望有人能帮我解决这个问题,到目前为止,我已经尝试将所有用户的同类群组 ID 映射到一个数组中并通过 $elemMatch 进行查询

Events.find({ cohortsGroups: { $elemMatch: { $elemMatch: { _id: { $in: [ '6124beef59d728c82088fd59', '6124bf2159d728c82088fd60' ] } } } } })

但是这个解决方案只检索具有子数组队列匹配的每个事件,它没有考虑sets,所以在这种情况下它也会检索Event 3 - 因为存在2022 - 但它是与队列 @9​​87654338@ 配对,这是错误的。

如果我不够清楚,请告诉我,我们将不胜感激。至少要知道它是否可以作为 mongo 查询。

非常感谢阅读!

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:

    这应该可行:

    db.events.find({ cohortsGroups: { $elemMatch: { $not: {$elemMatch: { _id: { $nin: [ '6124beef59d728c82088fd59', '6124bf2159d728c82088fd60' ] } } } } } })
    

    外层$elemMatch,匹配所有队列组中任意数组匹配内层条件的文档。

    内在条件

    { $not: {$elemMatch: { _id: { $nin: [ '6124beef59d728c82088fd59', '6124bf2159d728c82088fd60' ] } } } } }
    

    正在使用带有$not$nin 的双重否定来查找没有带有_id 元素的子数组,除了您正在搜索的那些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2021-05-01
      相关资源
      最近更新 更多