Агрегация MongoDB — Доступ к полям поиска в проекте

#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 .