根据同一文档中的另一个数组查询 Mongo 文档数组
Posted
技术标签:
【中文标题】根据同一文档中的另一个数组查询 Mongo 文档数组【英文标题】:Query Mongo document array based on another array in the same document 【发布时间】:2020-06-11 06:19:17 【问题描述】:我有以下格式的 Mongo 文档:
"_id":
"$oid":"1237563648fe93j3b5"
,
"stage_id":
"$oid":"1213241423nn552l54j"
,
"payload":[
"_data":
"name":"name1",
"description":"",
"parent":"",
"status":"NOT READY"
,
"_data":
"name":"name2",
"description":"MS Visio",
"parent":"A7704",
"status":"OPERATING"
,
"_data":
"assetnum":"name3",
"description":"MS Visio",
"parent":"7127",
"status":"OPERATING"
],
"response":[
"_data":
"Error":
"message":"AVJPA - The record already exists.
"attrname":"name",
"reasonCode":"AVJPA",
"status":"400"
,
"_meta":
"status":"400"
,
"_data":
"Error":
"message":"AVJPA - The record already exists.
"attrname":"name",
"reasonCode":"AVJPA",
"status":"400"
,
"_meta":
"status":"400"
,
"_data":
"message":"success"
,
"_meta":
"status":"204"
]
这种格式的文档有很多。 response
数组是对 payload
数组中项目的响应,这些项目已发布到 API 端点。所以响应数组中的index 0
就是payload 数组中index 0
有效载荷的响应。现在我想过滤集合并希望得到响应reasonCode
是AVJPA
的有效载荷。如何做到这一点?我正在使用以下代码来找出存在Error
的响应,但不确定如何找到与响应对应的有效负载。
logs.find(
"stage_id":1213241423nn552l54j
$elemMatch: "_responsedata.Error": $exists: true
)
logs
是我收藏的名称。我在 Python 中运行此代码并使用 PyMongo 客户端库。
【问题讨论】:
请发布预期结果,不清楚您要做什么。是否要返回payload
:[ 索引 0 和 1] ?
没错。但不是索引。这些索引的数据作为一个数组。
【参考方案1】:
检查这是否符合您的要求:
db.logs.aggregate([
$match:
"stage_id": ObjectId("5a934e000102030405000001"),
"response":
$elemMatch:
"_data.Error":
$exists: true
,
$addFields:
tmp: "$payload"
,
$unwind:
path: "$tmp",
includeArrayIndex: "idx",
preserveNullAndEmptyArrays: false
,
$match:
$expr:
$eq: [
$let:
vars:
input:
$arrayElemAt: [
"$response",
"$idx"
]
,
in: "$$input._data.Error.reasonCode"
,
"AVJPA"
]
,
$group:
_id: "$_id",
stage_id:
$first: "$stage_id"
,
payload:
$push:
$arrayElemAt: [
"$payload",
"$idx"
]
,
response:
$push:
$arrayElemAt: [
"$response",
"$idx"
]
,
])
MongoPlayground
【讨论】:
以上是关于根据同一文档中的另一个数组查询 Mongo 文档数组的主要内容,如果未能解决你的问题,请参考以下文章