#mongodb #mongoose #mongodb-query #aggregation-framework
Вопрос:
Я получаю доступ к полю поиска в $project с помощью $unwind, но это нарушает доступность других вложенных полей из основной коллекции. Есть ли какой-либо способ получить доступ к полям из обеих коллекций в $project. Я думал о слиянии массивов, но все еще не уверен, что это правильный подход.
Коллекция пользователей
{ "_id" : ObjectId("5a54f739fe0a00373e7ef1e8"), "team" : { "name" : "test", }, "updated_at" : ISODate("2018-05-22T04:28:00Z"), "created_at" : ISODate("2018-01-09T17:09:13Z"), "users" : [ { "updated_at" : ISODate("2018-11-22T11:55:22Z"), "created_at" : ISODate("2018-01-09T17:09:13Z"), "_id" : ObjectId("5a54f739fe0a00373e7ef1e9"), "name" : test, "status" : "active", "title" : "Engineer", }, { "updated_at" : ISODate("2018-11-22T11:55:22Z"), "created_at" : ISODate("2018-01-09T17:09:13Z"), "_id" : ObjectId("5a54f739fe0a00373e7ef1e9"), "name" : test1, "status" : "passive", "title" : "Tester", } ]
}
Коллекция комментариев:
{ "_id" : ObjectId("6062178fc73fe806e45c9b69"), "userId" : "5a54f739fe0a00373e7ef1e9", 'text' : 'this is a test', "status" : "1", "timestamp" : ISODate("2021-03-29T18:08:14.317Z") }
Трубопровод
$pipeline = [['$match' =gt; [ 'users' =gt; [ '$elemMatch' =gt; [ 'field1' =gt; $field1, ], ] ] ], ['$unwind' =gt; '$users'], ['$match' =gt; [ 'users.field1' =gt; $field1, ] ], ['$addFields' =gt; ['userId' =gt; ['$toString' =gt; '$userId' ]]], ['$lookup' =gt; [ 'from' =gt; 'comments', 'localField' =gt; 'userId', 'foreignField' =gt; 'userId', 'as' =gt; 'userComments' ] ], ['$unwind' =gt; '$userComments'], ['$project' =gt; [ 'comments' =gt; [ '$switch' =gt; [ 'branches' =gt; [ [ 'case' =gt; [ '$eq' =gt; ['$userComments.status','verified'] ], 'then' =gt; 1], [ 'case' =gt; [ '$lte' =gt; ['$userComments.status', ''] ], 'then' =gt; 1], ], 'default' =gt; 0 ] ], 'status' =gt; '$users.status', 'total' =gt; [false], ] ], ['$group' =gt; [ '_id' =gt; $groupBy, 'text' =gt; ['$sum' =gt; '$comments'], 'total' =gt; ['$sum' =gt; '$total'], 'completed' =gt; ['$sum' =gt; '$status'], ] ], ];
Результат
{"_id" :"categories","text": 21,"total": 100,"completed":50}
Комментарии:
1. пожалуйста, предоставьте примеры данных и предпочитаемые вами выходные данные в формате JSON
2. @mohammadNaimi Я добавил примерные данные.
3. Вместо первых трех этапов вы можете использовать
$filter
операцию для фильтрацииusers
.