MongoDB сравнивает два поля и суммирует другое поле во всех документах - PullRequest
1 голос
/ 25 марта 2020

Образцы документов:

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"}}})

Я должен получить сумму всех значений v на x1 == x2. Я попробовал вышеуказанный запрос и не получил никакого вывода.

1 Ответ

1 голос
/ 25 марта 2020

Ваш 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

...