我是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?)
答案 0 :(得分:3)
使用其他$group
和$project
阶段投影所需的输出
Group
email
和name
,为每个唯一身份获取一条记录
组合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文档中的聚合或其他任何东西一起使用。