“:”f190542db721000900d33e77090e3dd3“ }, “job”:“MASTER_PROD / UPLANE / L2-PS / BUILD.bbp”, “patchset”:“2”, “管道”:“门”, “项目”:“MN / 5G </跨度> / NB / GNB” “释放”:“18A锟”, “结果”:“成功”, “重试”:0, “重用”:0, “服务器”:“es-si-os-ohn-65- 5克 </跨度> -ci常见-6D9" , “startTime”:“1531304202954”, “timestamp”:“1531304202953”, “uuid锟
你在管道阶段使用$$会犯一个错误:$$代表'base'集合,$代表'join'集合。在管道和结果上使用$ match进行过滤时,
{ $eq: [ "$$change", "$change"]}, { $eq: [ "$$patchset", "$patchset"]}, { $eq: [ "$$pipeline", "check" ]}, ===> always true { $eq: [ "$$job", "$job" ]}, { $ne: [ "$$result", "SUCCESS" ]} ===> always false
这是正确的语法:
{ $eq: [ "$$change", "$change"]}, { $eq: [ "$$patchset", "$patchset"]}, { $eq: [ "$pipeline", "check" ]}, // or { $eq: [ "$pipeline", "$$pipeline" ]} { $eq: [ "$$job", "$job" ]}, { $ne: [ "$result", "SUCCESS" ]} // or { $ne: [ "$result", "$$result" ]}
但是,通过翻译您的需求,您可以在不使用$ lookup阶段的情况下实现相同的目标: 你需要构建
您可以使用以下内容执行此操作:
db.builds.aggregate([ { $match: { pipeline: "check", } }, { $group: { _id: { change: "$change", patchset: "$patchset", job: "$job", pipeline: "$pipeline" }, builds: { $push: "$$ROOT" }, resultset: { $addToSet: "$result" } } }, { $match: { $expr: { $and: [ { $gt: [ { $size: "$resultset" }, 1 ] }, { $in: [ "SUCCESS", "$resultset" ] } ] } } } ])
你可以测试一下 这里 。希望能帮助到你