【问题标题】:How to compare attributes of different objects in mongodb object array如何比较mongodb对象数组中不同对象的属性
【发布时间】:2019-06-28 04:23:54
【问题描述】:

我的 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”的对象的值的所有文档。

即字段2(值) > 字段3(值)

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

如何为此编写 MongoDB 查询?

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

【问题讨论】:

  • 您是否希望仅在两个字段都存在时包含用于比较的文档?
  • 就可以了。但是,如果有一种方法可以使用一些默认值来包含没有这些字段的文档。我也想知道。
  • 当然。默认值是多少?
  • 假设这两个字段分别是 10 和 5。

标签: mongodb mongodb-query aggregation-framework


【解决方案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"]}}
}})

【讨论】:

  • 数组索引不是所有的字段条目吗?
  • @DaveStSomeWhere 不确定我是否关注。字段条目在不同文档中的不同位置。所以 $indexofarray 通过字段 id 搜索字段条目的索引,然后是 $arrayElemAt 以检索该索引处的字段条目。
  • 好的 - 正在测试,直到你最近的更新才有效,很高兴它现在有效 - 所以忽略我的困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 2018-12-30
  • 2021-09-09
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 2021-05-08
相关资源
最近更新 更多