匹配 Mongoose 中的两个不同字段,聚合?
Posted
技术标签:
【中文标题】匹配 Mongoose 中的两个不同字段,聚合?【英文标题】:Match Two different fields in Mongoose, Aggregate? 【发布时间】:2018-07-11 09:49:38 【问题描述】:我正在尝试匹配同一文档中的两个不同字段。但没有得到我想要的预期输出。 让我举个例子。
我想在同一文档中匹配weighted.phaseId
和phases._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")
]
【问题讨论】:
你做了什么聚合?以及原始文档结构? 【参考方案1】:您可以使用以下聚合:
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
仅获取weighted
的phaseId
字段,然后我们可以使用$filter 过滤掉phases
,检查每个阶段是否存在对应的id
(使用$indexOfArray否则返回 -1)
【讨论】:
以上是关于匹配 Mongoose 中的两个不同字段,聚合?的主要内容,如果未能解决你的问题,请参考以下文章