使用MongoDB db.collection.aggregate的结果排除db.collection.find的结果

时间:2018-03-28 13:58:36

标签: angularjs node.js mongodb

我正在编写AngularJS和Node中的MongoDB函数,我有一个集合,其中有一个名为documentId的字段,它不是唯一的。我想找到该集合中的所有文档,其中特定文档的NONE状态字段包含单词open,并且仅包含所有状态的文档'是"关闭"或"取消"。

例如:

IOLoop.spawn_callback

我希望我的结果只包含documentId 002而不包含documentId 001,因为其中一个文档包含documentId 001,其状态为open。但由于所有带有documentId 002的文档都处于关闭或取消状态,我希望将其包含在我的结果中。

我可以使用以下内容获取我想要从db.collection.find()中排除的文档的聚合...

Unlike all other callback-related methods on IOLoop, spawn_callback does not associate the callback with its caller’s stack_context

);

但现在我想在执行my ...

时在查询中使用聚合的数组结果
_id: <val> , companyId : "CO-000001", documentId : "001", status:"closed", value:"123.45"
_id: <val> , companyId : "CO-000001", documentId : "002", status:"closed", value:"323.67"
_id: <val> , companyId : "CO-000001", documentId : "001", status:"open", value:"434.56"
_id: <val> , companyId : "CO-000001", documentId : "002", status:"canceled", value:"523.16"

有没有办法在另一个查询中使用聚合的结果?或者有没有办法在聚合中完成所有这些?

1 个答案:

答案 0 :(得分:0)

根据您的需要更改投影。观察我以后如何使用组和匹配阶段来获取所需的数据。希望这能解决你的问题。

 db.tickets.aggregate(
    [
        { 
            "$match" : {
                "companyId" : "CO-000001"
            }
        }, 
        { 
            "$group" : {
                "_id" : "$documentId", 
                "status" :{
                "$addToSet" : "$status"
                }
            }
        },
        {
            $match:{ status:{$nin:["open","on hold"]} }
        },{
        $lookup:{  
             from:"tickets",
             as: "final",
             localField: "_id",
             foreignField: "documentId",
          }
        },
        {
            $project :{
                _id:0,
                final:1
            }
        }
    ], 
    { 
        "allowDiskUse" : false
    }
    ).pretty();