【问题标题】:Match Two different fields in Mongoose, Aggregate?匹配 Mongoose 中的两个不同字段,聚合?
【发布时间】:2018-07-11 09:49:38
【问题描述】:

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

我想在同一文档中匹配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")
        }
    ]
}

【问题讨论】:

  • 你做了什么聚合?以及原始文档结构?

标签: node.js mongodb mongoose aggregate


【解决方案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 仅获取weightedphaseId 字段,然后我们可以使用$filter 过滤掉phases,检查每个阶段是否存在对应的id(使用$indexOfArray否则返回 -1)

【讨论】:

    猜你喜欢
    • 2020-12-10
    • 1970-01-01
    • 2016-07-11
    相关资源
    最近更新 更多