匹配 Mongoose 中的两个不同字段,聚合?

Posted

技术标签:

【中文标题】匹配 Mongoose 中的两个不同字段,聚合?【英文标题】:Match Two different fields in Mongoose, Aggregate? 【发布时间】: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")
        
    ]

【问题讨论】:

你做了什么聚合?以及原始文档结构? 【参考方案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)

【讨论】:

以上是关于匹配 Mongoose 中的两个不同字段,聚合?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 聚合内部查找按字段分组

带有全文搜索和项目的 Mongoose 子字段聚合

Mongoose - 如何聚合两个集合中的内容

Mongoose 聚合匹配 objectIds 数组

在检查匹配项的同时使用聚合 Mongoose 查询的结果(Mongoose/Express)

Mongoose:聚合获取数组类型字段的文档并根据特定字段过滤这些文档