gpt4 book ai didi

node.js - 匹配 Mongoose 中的两个不同字段,聚合?

转载 作者:太空宇宙 更新时间:2023-11-04 00:13:06 25 4
gpt4 key购买 nike

我正在尝试匹配同一文档中的两个不同字段。但没有得到我想要的预期输出。让我用一个例子来展示。

我想将同一文档中的 weighted.phaseIdphases._id 进行匹配,并且不匹配的内容应从 phases 字段中删除。

有人有想法吗?

//在数据库上处理一些聚合查询后的文档。

{
"_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")
}
]
}

//预期输出

{
"_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")
}
]
}

最佳答案

您可以使用以下聚合:

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 ] }
}
}
}
}
])

我们使用$map仅获取weightedphaseId字段,然后我们可以过滤掉phases > 使用$filter检查每个阶段是否存在相应的 id(使用 $indexOfArray 否则返回 -1)

关于node.js - 匹配 Mongoose 中的两个不同字段,聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48556504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com