当前位置: 首页 > 知识库问答 >
问题:

MongoDB:查询匹配未知键的文档

弘兴言
2023-03-14

我有一个集合,其中包含具有以下结构的文档:

{
  "userId": "57e32f05-fca1-452c-aace-76f35962fe4a",
  "availableSearches": {
    "7fcb6d67-f825-41ca-b47c-fecaedc738c7": {
      "searchType": "RECENT",
      "searchId": "7fcb6d67-f825-41ca-b47c-fecaedc738c7",
      "enabled": false,
    }
    "2b59ee7b-256b-47c2-9573-18676951cb0d": {
      "searchType": "RECENT",
      "searchId": "2b59ee7b-256b-47c2-9573-18676951cb0d",
      "enabled": true,
    }
  }
}
["7fcb6d67-f825-41ca-b47c-fecaedc738c7", 
 "2b59ee7b-256b-47c2-9573-18676951cb0d",
 ...]

我想在1个查询中获取AvailableSearches.${KEY}存在或AvailableSearches.${KEY}.searchid等于${KEY}的所有文档。即与列表中的键匹配的文档。

在MongoDB中有没有办法做到这一点?

共有1个答案

刘安志
2023-03-14

您可以尝试以下聚合查询:

db.collection.aggregate([
   /** Add a new field to all docs where `availableSearches` will converted to an array of [{k:...,v:...},{k:...,v:...}]*/
  {
    $addFields: { availableSearchesConverted: { $objectToArray: "$availableSearches" } }
  },
  /** Match on k field of new array */
  {
    $match: {
      "availableSearchesConverted.k": {
        $all: [ // Use `$in` if you wanted to get docs if atleast one value exists. `$all` checks for all input elements should exists
          "7fcb6d67-f825-41ca-b47c-fecaedc738c7", "2b59ee7b-256b-47c2-9573-18676951cb0d"
        ]
      }
    }
  },
  /** Remove newly created field from output */
  {
    $project: {
      availableSearchesConverted: 0
    }
  }
])

测试:mongoplayground

 类似资料:
  • 所以我对大约500k文档有以下查询,它在数据库端非常慢: 我知道allowDiskUse使它变慢,但如果禁用它,我会得到: MongoError:超过$group的内存限制,但不允许外部排序。通过允许磁盘使用:真来选择加入。

  • 我有一个相当于: 我希望执行一个查询,返回任何文档,这些文档对于嵌套在中的任何键都具有具有特定值的键。类似于: 将检索两个文件。

  • 来自< code>$elementMatch的MongoDB文档: $elemMatch运算符将包含数组字段的文档与至少一个与所有指定查询条件匹配的元素匹配。 但是,如何将包含数组字段的文档与与查询匹配的所有元素进行匹配? 例如,我有这样的文档: 我需要匹配所有具有所有 如果我使用以下查询: 该文档将被匹配,因为至少有一个价格 我也试过这个,但它似乎不工作: 有没有办法排除查看所有价格而不是至少一

  • 主要内容:find() 方法,pretty() 方法,findOne() 方法,条件查询,AND条件语句,OR 条件语句,AND 和 OR 联合使用前面我们介绍了怎么将文档插入到集合中,本节我们来介绍一下如何从集合中查询指定的文档。 find() 方法 想要查询集合中的文档,可以使用 MongoDB 中的 find() 方法,find() 方法可以将查询结果以非结构化的方式展示出来,其语法格式如下: db.collection_name.find(query, projection) 语法说明如

  • 问题内容: 我有一些文件: 我想要得到的结果,其匹配的任何值一样 在这种情况下,我想得到结果:一个数组: 我该怎么办?谢谢。 问题答案: 您应该看一下MongoDB 中的运算符。然后将它与find一起使用,以使您的请求更快,可以使用方法:使用它,mongoDB将返回JS对象而不是Mongoose模型/对象。 然后,您可以在结果数组上使用方法: 希望对您有帮助, 最好的问候

  • 我有一个MongoDB存储来自不同传感器的数据。它具有以下结构: 例如,现在我需要“heart rate”-文档的所有字段和“data”-子文档的所有字段都符合条件“时间戳在1483537204000和1483537214000之间”。