2017-01-14 4 views
0

Мне нужно найти счет всех соответствующих элементов массива и count = 0, если вложенный массив не содержит значений. Вот моя структура сущности данных.Найти количество всех совпадающих элементов в массиве

{ 
    name:A, 
    issues:[1,2,3,4] 
} 
{ 
    name:B, 
    issues:[1,2] 
} 
{ 
    name:C, 
    issues:[3,4] 
} 

Если поиск пользователей для issues:[1,2], я хочу, чтобы мой набор результатов, чтобы выглядеть

[{ 
    name:A, 
    count:2 
} 
{ 
    name:B, 
    count:2 
} 
{ 
    name:C, 
    count:0 
}] 

Я использую ниже запроса для достижения этой цели, но это только возвращает меня результат

[{ 
    name:A, 
    count:2 
} 
{ 
    name:B, 
    count:2 
}] 

который определенно я знаю из-за $ match, я делаю

{'$unwind':'$issues'} 
,{'$match':{'allissues': {$in: p.issues? p.issues.map(Number):[]}}} 
,{ '$group' :{_id:'$_id', name :{ $first: '$name' },count: { $sum: 1 }} }' 
+1

вы можете попробовать что-то вроде этого. 'db.collection.aggregate ([{$ project: {count: {$ size: {$ setIntersection: [p.issues," $ issues "]}}}}])' – Veeram

ответ

1

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