首页 > 解决方案 > 在 MongoDB 中查找作为名称/值对而不是数组元素的值的子文档

问题描述

也许我的文档结构不太适合我正在尝试做的事情,但经过一段时间的努力,我意识到$elemMatch可能不会成为我的朋友。这是一个示例文档:

{
  "field": {
    "abc": {
      x: 0,
      str: "aaa"
    },
    "def": {
      x: 1,
      str: "bbb"
    },
    "ghi": {
      x: 2,
      str: "ccc"
    }
  }
}

我正在尝试构建一个查询,以查找满足“field.$.x > 1”或任何程度的文档。基本上,第二级字段的名称可以是任何名称。如果field是一个数组,我猜它$elemMatch会很好地工作。

标签: mongodbmongodb-query

解决方案


由于您不知道键的名称,因此您必须使用$objectToArray它将转换field为三个键值对的数组。然后你可以运行$map来应用你的条件x$anyElementTrue来检查是否有任何项目符合指定的条件:

db.collection.find({
    $expr: {
        $anyElementTrue: {
            $map: {
                input: { $objectToArray: "$field" },
                in: { $gt: [ "$$this.v.x", 1 ] }
            }
        }
    }
})

蒙戈游乐场


推荐阅读