【问题标题】:MongoDB compare two fields & sum another field on all docsMongoDB比较两个字段并对所有文档中的另一个字段求​​和
【发布时间】:2020-03-25 14:38:06
【问题描述】:

示例文档:

db.l5p1s3.insertMany([{x1:0,x2:0,v:0.08},{x1 : 0,x2:1,v:0.07},{x1:0,x2:2,v:0.04},{x1:0,x2:3,v:0.00}])
db.l5p1s3.insertMany([{x1:1,x2:0,v:0.06},{x1 : 1,x2:1,v:0.15},{x1:1,x2:2,v:0.05},{x1:1,x2:3,v:0.04}])
db.l5p1s3.insertMany([{x1:2,x2:0,v:0.05},{x1 : 2,x2:1,v:0.04},{x1:2,x2:2,v:0.10},{x1:2,x2:3,v:0.06}])
db.l5p1s3.insertMany([{x1:3,x2:0,v:0.00},{x1 : 3,x2:1,v:0.03},{x1:3,x2:2,v:0.04},{x1:3,x2:3,v:0.07}])
db.l5p1s3.insertMany([{x1:4,x2:0,v:0.00},{x1 : 4,x2:1,v:0.01},{x1:4,x2:2,v:0.05},{x1:4,x2:3,v:0.06}])

查询:

db.l5p1s3.aggregate({$match : { x1 :{$eq : "x2"} }} , {$group : {_id : {} , sum : {$sum : "$v"}}})

我必须在x1 == x2 处获得 v 的所有值的总和。我尝试了上面的查询,没有得到任何输出。

【问题讨论】:

  • 假设你有这两个文档 :: { "_id": ObjectId("5a934e000102030405000000"), "v": 0.08, "x1": 0, "x2": 0 }, { "_id": ObjectId("5a934e000102030405000005"), "v": 0.15, "x1": 1, "x2": 1 } 你想合并两个文档并得到最终值 sum : 0.23 吗?或者您是否要将这两个保留为两个不同的文档,导致第一个文档的 x1,x2 != 第二个文档的 x1,x2 ?以防万一如果你想把这两个分开检查这个:: (mongoplayground.net/p/MlKATveyiFV)
  • 用这个替换小组赛阶段 :: { $group: { _id: { x1: "$x1", x2: "$x2" }, sum: { $sum: "$v" } } }

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

您的 match 阶段 ({$match : { x1 :{$eq : "x2"} }}) 说获取所有文档,其中 x1 字段具有字符串值 x2 - 这不是您要查找的内容。因此,要比较两个字段并获取所需的 o/p,请尝试以下聚合查询:

db.collection.aggregate([
  /** Matches docs where x1 == x2 */
  { $match: { $expr: { $eq: ["$x1", "$x2"] } } },
  /** Iterate over all docs & sum -up 'v' field */
  { $group: { _id: "", sum: { $sum: "$v" } } }
]);

测试: MongoDB-Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2023-02-21
    • 2021-12-11
    • 2020-06-28
    • 1970-01-01
    相关资源
    最近更新 更多