【发布时间】:2020-01-16 19:09:52
【问题描述】:
我正在尝试创建聚合 MongoDB 查询。
数据结构:
{
"object_name": Example,
"values": [ {"name":"value1", "value":1},
{"name":"value2", "value":10},
{"name":"total", "value":105}
}
目标:在value1/total > 0.5 和value2/total > 0.25 和total > 100 的位置找到对象名称。
以这种方式构造数据以提供 value_name 和 value 字段的索引。
我尝试过的 - 与以下管道聚合:
$match: 过滤总数 > 100 的文档:
$match: { values: { $elemMatch: { value_name: "total", value: {$gte: 100 }
$project:只获取我们需要的 value_names(有近 200 个不同的名称)
$project: {
values: {
$filter: {
input: "$values",
as: "value",
cond: { $or: [
{ $eq: [ "$$value.name", "name1"] },
{ $eq: [ "$$value.name", "name2"] },
{ $eq: [ "$$value.name", "total"] },
] }
}
},
name: 1
}
那么,{ $unwind: "$values" }
在这里,我可以 $group 到 $divide: name1/total, name2/total 但是我被困在如何获得这些值上。
我不能简单地做stats.value:,因为它不知道我指的是哪个值。我相信$group 不能做$elemMatch 也匹配名称。
如果有更简单的解决方案,我将非常感谢您的意见。
【问题讨论】:
-
所以您想要拥有所有这三个
value1/total > 0.5、value2/total > 0.25和total > 100满意的文档并且响应仅包含values数组中的那些对象? -
是的,我要满足三个条件。我唯一关心的返回字段是“object_name”。
标签: mongodb aggregation