MongoDB 提取文件
MongoDB Extract document
我有这个Json:
{
"_id": {
"$oid": "613a55dccXXXXXXX28b5ba3a1"
},
"user": "CHEWBACCA",
"paymentTypes": [{
"type": "PILOT",
"limits": [{
"type": "FLIGHT_HOURS",
"amount": 10
},
{
"type": "COMBAT_HOURS",
"amount": 80000
},
{
"type": "TRAINING_HOURS",
"amount": 80000
}
]
},
{
"type": "WARRIOR",
"limits": [{
"type": "FLIGHT_HOURS",
"amount": 22
},
{
"type": "COMBAT_HOURS",
"amount": 123
},
{
"type": "TRAINING_HOURS",
"amount": 456
}
]
}
],
"createdDate": "2021-11-11"
}
我想对 paymentType.type 等于“PILOT”和限制等于类型等于“COMBAT_HOURS”进行独占过滤。
这是我希望收到的结果。
{
"_id": {
"$oid": "613a55dccXXXXXXX28b5ba3a1"
},
"user": "CHEWBACCA",
"paymentTypes": [{
"type": "PILOT",
"limits": [{
"type": "COMBAT_HOURS",
"amount": 80000
}]
}],
"createdDate": "2021-11-11"
}
如何提取文件达到这个结果?
查询
- 地图
paymentTypes
- 如果
paymentType= PILOT
,过滤限制以仅保留战斗时间
- else
null
(我们不想要那个 paymentType)
- 删除空值(那些空值是不是 PILOT 类型的 paymentType)
*这可能导致空数组,无论是在 paymentTypes 上还是在 limits 上,如果您不接受空数组,您可以匹配并删除包含这些空数组的文档
aggregate(
[{"$addFields":
{"paymentTypes":
{"$map":
{"input": "$paymentTypes",
"in":
{"$cond":
[{"$eq": ["$$ptype.type", "PILOT"]},
{"$mergeObjects":
["$$ptype",
{"limits":
{"$filter":
{"input": "$$ptype.limits",
"cond": {"$eq": ["$$this.type", "COMBAT_HOURS"]}}}}]},
null]},
"as": "ptype"}}}},
{"$addFields":
{"paymentTypes":
{"$filter":
{"input": "$paymentTypes", "cond": {"$ne": ["$$this", null]}}}}}])
我有这个Json:
{
"_id": {
"$oid": "613a55dccXXXXXXX28b5ba3a1"
},
"user": "CHEWBACCA",
"paymentTypes": [{
"type": "PILOT",
"limits": [{
"type": "FLIGHT_HOURS",
"amount": 10
},
{
"type": "COMBAT_HOURS",
"amount": 80000
},
{
"type": "TRAINING_HOURS",
"amount": 80000
}
]
},
{
"type": "WARRIOR",
"limits": [{
"type": "FLIGHT_HOURS",
"amount": 22
},
{
"type": "COMBAT_HOURS",
"amount": 123
},
{
"type": "TRAINING_HOURS",
"amount": 456
}
]
}
],
"createdDate": "2021-11-11"
}
我想对 paymentType.type 等于“PILOT”和限制等于类型等于“COMBAT_HOURS”进行独占过滤。
这是我希望收到的结果。
{
"_id": {
"$oid": "613a55dccXXXXXXX28b5ba3a1"
},
"user": "CHEWBACCA",
"paymentTypes": [{
"type": "PILOT",
"limits": [{
"type": "COMBAT_HOURS",
"amount": 80000
}]
}],
"createdDate": "2021-11-11"
}
如何提取文件达到这个结果?
查询
- 地图
paymentTypes
- 如果
paymentType= PILOT
,过滤限制以仅保留战斗时间 - else
null
(我们不想要那个 paymentType) - 删除空值(那些空值是不是 PILOT 类型的 paymentType)
*这可能导致空数组,无论是在 paymentTypes 上还是在 limits 上,如果您不接受空数组,您可以匹配并删除包含这些空数组的文档
aggregate(
[{"$addFields":
{"paymentTypes":
{"$map":
{"input": "$paymentTypes",
"in":
{"$cond":
[{"$eq": ["$$ptype.type", "PILOT"]},
{"$mergeObjects":
["$$ptype",
{"limits":
{"$filter":
{"input": "$$ptype.limits",
"cond": {"$eq": ["$$this.type", "COMBAT_HOURS"]}}}}]},
null]},
"as": "ptype"}}}},
{"$addFields":
{"paymentTypes":
{"$filter":
{"input": "$paymentTypes", "cond": {"$ne": ["$$this", null]}}}}}])