Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在Mongoose中匹配两个不同的字段,聚合?_Node.js_Mongodb_Mongoose_Aggregate - Fatal编程技术网

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

Node.js 在Mongoose中匹配两个不同的字段,聚合?,node.js,mongodb,mongoose,aggregate,Node.js,Mongodb,Mongoose,Aggregate,我正在尝试匹配同一文档中的两个不同字段。但是没有得到我想要的预期输出。 让我举个例子 我想将加权.phaseId与阶段进行匹配。_id在同一文档中,不匹配的应该从阶段字段中删除 有人有主意吗 //在数据库上处理某些聚合查询后的文档 { "_id" : ObjectId("5a680c803096130f93d11c7a"), "weighted" : [ { "phaseId" : ObjectId("5a6734c32414e15d0c

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

我想将
加权.phaseId
阶段进行匹配。_id
在同一文档中,不匹配的应该从
阶段
字段中删除

有人有主意吗

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

{
    "_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
只获取
加权
阶段id
字段,然后我们可以通过检查每个阶段是否存在相应的
id
来过滤
阶段
(否则使用该字段返回-1)

您所做的聚合是什么?原始文档结构是什么?