匹配猫鼬中的两个不同字段,聚合? [英] Match Two different fields in Mongoose, Aggregate?

查看:48
本文介绍了匹配猫鼬中的两个不同字段,聚合?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我想在相同的文档中将 weighted.phaseIdphases._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 只取 weightedphaseId 字段,然后我们可以过滤掉 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆