Как получить агрегированные результаты в Loopback-запросе Mongo

Я новичок в loopback и мне нужно исправить следующую проблему. Мне нужны разные результаты от монго из двух полей (электронная почта и имя).

Данные :

var a = [ { электронная почта: '[email protected]', имя: 'x'}, { электронная почта: '[email protected]', имя: 'x'}, { электронная почта: '[email protected]' ,имя: 'з'} ]

Выход :

var a = [ 
{ email: '[email protected]',name: 'x'},
{ email: '[email protected]',name: 'z'}
]

Как я могу использовать следующую агрегатную функцию в петле, чтобы получить желаемые результаты вывода.

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

(Источник Как эффективно работать с несколькими ключами?)


person Vaibhav Magon    schedule 03.01.2015    source источник


Ответы (2)


Используйте дополнительные этапы $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" : "[email protected]",
                        "name" : "z"
                },
                {
                        "email" : "[email protected]",
                        "name" : "x"
                }
        ]
}
person BatScream    schedule 03.01.2015
comment
как я могу использовать следующий код... Так это код обратной связи, который вы разместили здесь. Это не похоже. Я думаю, что большинство людей в сообществе предпочли бы, чтобы эксперты, которые отвечают на их вопросы, на самом деле были экспертами, обладающими определенными знаниями в вопросе, который они задали. - person Neil Lunn; 03.01.2015
comment
Точно Нил. Мне нужен код Loopback, чтобы реализовать это. - person Vaibhav Magon; 03.01.2015
comment
@ Vaibhav- Я просто хотел дать представление о том, как это сделать. Просто подумал, что это может быть использовано владельцем поста, чтобы понять, как это нужно сделать. Вы всегда можете оставить этот ответ как неприемлемый и дождаться ответа эксперта или попробовать изменить синтаксис для loopback. Я могу предложить вам отправную точку — docs .strongloop.com/display/public/LB/, github.com/strongloop/ loopback/issues/890. - person BatScream; 03.01.2015

Этот ответ немного запоздал, но я надеюсь, что он может быть полезен кому-то еще, кто наткнется на это. Чтобы получить доступ к агрегатным функциям mongo в loopback, вы должны обойти абстракцию, в результате чего ваш код больше не зависит от базы данных, имейте это в виду, так как если вы когда-либо переключаете базы данных, вам придется изменить этот код. В loopback вы должны написать следующий код:

var connector = app.dataSources.yourMongoConnector.connector

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

Вы можете использовать этот метод для доступа к любым операциям с базой данных, отсутствующим в петле. Я еще не тестировал агрегатный метод, но успешно использовал его с findAndModify() и Different(), поэтому нет сомнений, что он будет работать с агрегатом или чем-либо еще в документации mongoDb.

person Lance    schedule 10.10.2015
comment
Единственная проблема заключается в том, что результатом будет объект, а не постоянный объект, который вы ищете. - person tspentzas; 06.10.2018