2016-04-29 3 views
1

Предположим, у меня есть набор документов, что-то вроде этого:MongoDB: Получить количество общих документов на основе значения поля

{ 
"itemName":"Burger", 
"userId":"25286", 
"location":{ 
     "locationTitle":"Burger king,Delhi" 
    } 
} 

{ 
"itemName":"Burger", 
"userId":"25287", 
"location":{ 
     "locationTitle":"Burger king,Delhi" 
    } 
} 

Я должен найти общие элементы между двумя пользователями. Пункт будет распространен, если одно из полей itemName или locationTitle имеют одинаковое значение поля. Но один пользователь может иметь более одного элемента с тем же именем.

Благодаря

ответ

2

Вы можете использовать агрегацию сгруппировать общие элементы вместе. Два запроса ниже записей группы, если они имеют одно имя itemName или locationTitle и добавляют userIds к массиву пользователей. поэтому массив пользователей не будет содержать дубликатов, поэтому учитывается требование, чтобы userId не добавлялось дважды, если одна и та же запись появляется более одного раза.

db.items.aggregate({ 
    $group: { 
    _id: "$itemName", 
    users: { 
     $addToSet: "$userId" 
    }, 
    count: { 
     $sum: 1 
    } 
    } 
}); 

db.items.aggregate({ 
    $group: { 
    _id: "$location.locationTitle", 
    users: { 
     $addToSet: "$userId" 
    }, 
    count: { 
     $sum: 1 
    } 
    } 
}); 
+0

Это не работает, если я буду обновлять ITEMNAME к «пицца» из первого документа, он дает мне результат мне { «_id»: «Burger», «пользователи»: [ «25287»] , "count": 1} {"_id": "pizza", "users": ["25286"], "count": 1} , но это должно быть общим, поскольку в обоих документах есть одинаковое значение locationTitle. –

+0

Есть два запроса выше, один из которых будет делать счет на itemName, а другой - на locationTitle. Я не уверен, есть ли один запрос, который будет делать оба. Позвольте мне проверить –

+0

Что произойдет в тех случаях, когда как itemName, так и locationTitle совпадают для двух пользователей? –

Смежные вопросы