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

标签 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(值) > Field3(值)

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

如何为此编写 MongoDB 查询?

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

最佳答案

假设您在文档中始终有两个字段,您可以在 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"]}}
}})

关于mongodb - 如何比较mongodb对象数组中不同对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54515966/

相关文章:

mongodb - 为什么在尝试从mongo集合中获取文档时为什么会出现 “client disconnected”错误?

MongoDB 索引

javascript - 我如何使用 Mongoose 聚合推送特定字段的值

mongodb - $geowithin 与 $lookup 上的外国收藏

node.js - 返回重复结果的 Mongoose 查询

javascript - 通过引用修改 Javascript 对象

mongodb - 如何在 $or 中使用 $regex 作为聚合表达式

node.js - MongoDb 插入时出现重复错误

javascript - MongoDB shell,$pop 运行异常

Mongodb聚合(月)查询将 "missing fields"设置为零