匹配猫鼬中的两个不同字段,聚合? [英] Match Two different fields in Mongoose, Aggregate?
问题描述
我正在尝试匹配同一文档中的两个不同字段.但没有得到我想要的预期输出.让我举个例子.
我想在相同的文档中将 weighted.phaseId
与 phases._id
匹配,不匹配应该从 phases
字段中删除.>
有人有想法吗?
//处理数据库上的一些聚合查询后的文档.
<代码>{"_id" : ObjectId("5a680c803096130f93d11c7a"),加权":[{"phaseId" : ObjectId("5a6734c32414e15d0c2920f0"),"_id" : ObjectId("5a680c803096130f93d11c7b")},{"phaseId" : ObjectId("5a6734c32414e15d0c2920ee"),"_id" : ObjectId("5a680c803096130f93d11c7c")}],阶段":[{"phase_name": "阶段 1","_id" : ObjectId("5a6734c32414e15d0c2920f0")},{"phase_name": "阶段 2","_id" : ObjectId("5a6734c32414e15d0c2920ef")},{"phase_name": "阶段 3","_id" : ObjectId("5a6734c32414e15d0c2920ee")},{"phase_name": "阶段 4","_id" : ObjectId("5a6734c32414e15d0c2920ed")}]}
//预期输出
<代码>{"_id" : ObjectId("5a680c803096130f93d11c7a"),加权":[{"phaseId" : ObjectId("5a6734c32414e15d0c2920f0"),"_id" : ObjectId("5a680c803096130f93d11c7b")},{"phaseId" : ObjectId("5a6734c32414e15d0c2920ee"),"_id" : ObjectId("5a680c803096130f93d11c7c")}],阶段":[{"phase_name": "阶段 1","_id" : ObjectId("5a6734c32414e15d0c2920f0")},{"phase_name": "阶段 3","_id" : ObjectId("5a6734c32414e15d0c2920ee")}]}
您可以使用以下聚合:
db.col.aggregate([{$addFields:{加权 ID:{$地图:{输入:$加权",如:w",在:$$w.phaseId"}}}},{$项目:{_id: 1,加权:1,阶段:{$过滤器:{输入:$phases",如:阶段",cond: { $gte: [ { $indexOfArray: [ "$weightedIds" , "$$phase._id" ] }, 0 ] }}}}}])
我们使用 $map
只取 weighted
的 phaseId
字段,然后我们可以过滤掉 phases
使用 $filter 检查每个阶段是否对应 id
存在(使用 $indexOfArray 返回 -1 否则)
I'm trying to match two different fields in the same document. But didn't get expected output as I want. Let me show with an example.
I want to match weighted.phaseId
with phases._id
in same documents and not match should be removed from phases
fields.
Does any one have an Idea ?
// Document after processing some aggregate query over a database.
{
"_id" : ObjectId("5a680c803096130f93d11c7a"),
"weighted" : [
{
"phaseId" : ObjectId("5a6734c32414e15d0c2920f0"),
"_id" : ObjectId("5a680c803096130f93d11c7b")
},
{
"phaseId" : ObjectId("5a6734c32414e15d0c2920ee"),
"_id" : ObjectId("5a680c803096130f93d11c7c")
}
],
"phases" : [
{
"phase_name" : "Phase 1",
"_id" : ObjectId("5a6734c32414e15d0c2920f0")
},
{
"phase_name" : "Phase 2",
"_id" : ObjectId("5a6734c32414e15d0c2920ef")
},
{
"phase_name" : "Phase 3",
"_id" : ObjectId("5a6734c32414e15d0c2920ee")
},
{
"phase_name" : "Phase 4",
"_id" : ObjectId("5a6734c32414e15d0c2920ed")
}
]
}
// Expected Output
{
"_id" : ObjectId("5a680c803096130f93d11c7a"),
"weighted" : [
{
"phaseId" : ObjectId("5a6734c32414e15d0c2920f0"),
"_id" : ObjectId("5a680c803096130f93d11c7b")
},
{
"phaseId" : ObjectId("5a6734c32414e15d0c2920ee"),
"_id" : ObjectId("5a680c803096130f93d11c7c")
}
],
"phases" : [
{
"phase_name" : "Phase 1",
"_id" : ObjectId("5a6734c32414e15d0c2920f0")
},
{
"phase_name" : "Phase 3",
"_id" : ObjectId("5a6734c32414e15d0c2920ee")
}
]
}
You can use following aggregation:
db.col.aggregate([
{
$addFields: {
weightedIds: {
$map:
{
input: "$weighted",
as: "w",
in: "$$w.phaseId"
}
}
}
},
{
$project: {
_id: 1,
weighted: 1,
phases: {
$filter: {
input: "$phases",
as: "phase",
cond: { $gte: [ { $indexOfArray: [ "$weightedIds" , "$$phase._id" ] }, 0 ] }
}
}
}
}
])
We're using $map
to take only phaseId
field of weighted
and then we can filter out phases
using $filter checking for each phase whether corresponding id
exists (using $indexOfArray which returns -1 otherwise)
这篇关于匹配猫鼬中的两个不同字段,聚合?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!