mongodb - $divide 嵌入文档的元素 - MongoDB 聚合
问题描述
我正在尝试创建一个聚合 MongoDB 查询。
数据结构:
{
"object_name": Example,
"values": [ {"name":"value1", "value":1},
{"name":"value2", "value":10},
{"name":"total", "value":105}
}
目标:在和和中查找对象名称。以这种方式构造数据以提供关于 value_name 和 value 字段的索引。value1/total > 0.5
value2/total > 0.25
total > 100
我尝试过的 - 与以下管道聚合:
$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
也匹配的名字。
如果有更简单的解决方案,我将非常感谢您的意见。
解决方案
您可以使用$arrayToObject运算符将数组转换为对象并添加tmp
字段以轻松访问value1
, value2
,total
值
db.collection.aggregate([
{
$addFields: {
tmp: {
$arrayToObject: {
$map: {
input: "$values",
as: "value",
in: {
k: "$$value.name",
v: "$$value.value"
}
}
}
},
name: 1
}
},
{
$match: {
$expr: {
$and: [
{
$gt: [
{
$divide: [
"$tmp.value1",
"$tmp.total"
]
},
0.5
]
},
{
$gt: [
{
$divide: [
"$tmp.value2",
"$tmp.total"
]
},
0.25
]
},
{
$gt: [
"$tmp.total",
100
]
}
]
}
}
},
{
$project: {
tmp: 0
}
}
])
推荐阅读
- azure - 具有 DeployIfNotExists 策略的私有 dns 区域组上的 Azure Terraform ignore_changes
- javascript - 对象在 React 中作为 React 子项无效
- apache-camel - Apache Camel ElasticSearch Rest 返回所有记录
- python - 神经网络的因子敏感性分析
- javascript - JavaScript 在关闭选项卡之前执行操作
- linux - 在 Linux 上将 Crashpad 与 Qt 集成
- java - LDAP 连接/Apache DS/Java
- javascript - 如何将文本插入到输入中键入的列表中
- php - 如何上传使用 javascript 创建的文件列表?
- typescript - TS-Jest 无法识别 webpack 定义插件变量