在MongoDB中查找属于名称/值对的值而不是数组元素的子文档

在MongoDB中查找属于名称/值对的值而不是数组元素的子文档,mongodb,mongodb-query,Mongodb,Mongodb Query,也许我的文档结构不太适合我要做的事情,但经过一段时间的努力,我意识到,$elemMatch可能不是我的朋友。以下是一份示例文档: { "field": { "abc": { x: 0, str: "aaa" }, "def": { x: 1, str: "bbb" }, "ghi": { x: 2, str: "ccc" } } } 我正在尝试构造一个查询,以查找满足

也许我的文档结构不太适合我要做的事情,但经过一段时间的努力,我意识到,
$elemMatch
可能不是我的朋友。以下是一份示例文档:

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

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

因为您不知道必须使用的键的名称,它会将
字段
转换为三个键值对的数组。然后,您可以运行以在
x
上应用您的条件,并检查是否有任何项目符合指定的条件:

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

有没有办法指定2+条件?如果我试图并排添加更多的
$gt
,我会得到
表示表达式的对象必须正好有一个字段。如果我想查询一系列的值呢?算出了。。。它应该是这样的:
in:{$and:[{$gt:[“$$this.v.x”,1]},{$lte:[“$$this.v.x”,10]}