如何在Loopback查询Mongo中获取聚合结果

时间:2015-01-03 11:47:24

标签: node.js mongodb loopbackjs

我是Loopback的新手,需要修复以下问题。我需要两个字段的mongo(电子邮件和名称)的不同结果。

数据:

  

var a = [{email:'x @ gmail.com',name:'x'},{email:   'x @ gmail.com',名称:'x'},{email:'x @ gmail.com',名称:'z'}]

输出:

var a = [ 
{ email: 'x@gmail.com',name: 'x'},
{ email: 'x@gmail.com',name: 'z'}
]

如何在loopback中使用以下聚合函数来获得所需的输出结果。

collection = db.tb;
result = collection.aggregate( 
            [
                {"$group": { "_id": { email: "$email", name: "$name" } } }
            ]
        );

(来源How to efficiently perform "distinct" with multiple keys?

2 个答案:

答案 0 :(得分:3)

使用其他$group$project阶段投影所需的输出

  • Group emailname,为每个唯一身份获取一条记录 组合
  • 再次group将所有记录放在一起并累积_id 使用$push运算符在上一阶段获得。
  • Project records字段并排除_id字段。

代码:

 result = collection.aggregate( 
        [
            {$group:{"_id":{"email": "$email","name": "$name" }}},
            {$group:{"_id":null,"records":{$push:"$_id"}}},
            {$project:{"_id":0,"records":1}},
        ]
    );

O / P:

{
        "records" : [
                {
                        "email" : "x@gmail.com",
                        "name" : "z"
                },
                {
                        "email" : "x@gmail.com",
                        "name" : "x"
                }
        ]
}

答案 1 :(得分:2)

这个答案有点晚了,但我希望它可能对其他绊脚石的人有价值。要在loopback中访问mongo聚合功能,您必须绕过抽象,因此您的代码不再与数据库无关,请记住,就好像您曾经切换数据库一样,您将不得不更改此代码。在loopback中,您将编写以下代码:

var connector = app.dataSources.yourMongoConnector.connector

result = connector.collection("yourCollection").aggregate([
            {"$group": { "_id": { email: "$email", name: "$name" } } }
        ])

您可以使用此方法访问loopback中不存在的任何数据库操作。我还没有测试聚合方法,但已经成功地将它与findAndModify()和distinct()一起使用 - 所以毫无疑问它将与mongoDb文档中的聚合或其他任何东西一起使用。