如何在mongodb对象数组中比较不同对象的属性

时间:2019-02-04 12:19:12

标签: mongodb mongodb-query aggregation-framework

我的mongodb文档结构如下:

{
"_id" : ObjectId("5b58673721b4b95a193d4e91"),
"pageId" : "page1",
"fields" : [ 
    {
        "fieldId" : "Field1",
        "value" : "test"
    }, 
    {
        "fieldId" : "Field2",
        "value" : 6.0
    },
    {
        "fieldId" : "Field3",
        "value" : 8.0
    }
]}

}

我想在集合中找到所有文档,其中fieldId为'Field2'的对象的值大于fieldId为'Field3'的对象的值。

即Field2(value)> Field3(value)

字段数组中的对象数不固定。我无法按职位进行比较。我必须按字段ID匹配对象。因此,在这种情况下,它必须位于以下行:
比较:对象值,其中fieldId ='Field2'与          对象值,其中fieldId ='Field3'

如何为此编写MongoDB查询?

我正在使用MongoDB 4.0版
(在某些情况下,文档中可能没有字段。 例如在设计中引入这些字段之前创建的文档)

1 个答案:

答案 0 :(得分:1)

假设文档中始终有两个字段,则可以在3.6中的以下查询中使用。

使用indexofarray将fieldId作为搜索条件来查找字段文档,然后进行值比较。

db.collectionname.find(
{"$expr":{
  "$let":{
    "vars":{
      "field2":{"$arrayElemAt":["$fields",{"$indexOfArray":["$fields.fieldId","Field2"]}]},
      "field3":{"$arrayElemAt":["$fields",{"$indexOfArray":["$fields.fieldId","Field3"]}]}
    },
    "in":{"$gt":["$$field2.value","$$field3.value"]}}
}})