Группировка всех других полей с помощью mongodb

У меня есть следующая структура таблицы:

Аренда:

{
 '_id' : '1',
 'user_id' : 1,
 'item_id' : 6,
 'name' : "First rental",
}
{
 '_id' : '2',
 'user_id' : 2,
 'item_id' : 7,
 'name' : "Second rental",
}
{
 '_id' : '3',
 'user_id' : 2,
 'item_id' : 8,
 'name' : "Third rental",
}

Я бы хотел, чтобы список аренды группировался такими пользователями:

{
 'user' : '1',
 'rental_count': 1,
 'rentals' : [
 {
 '_id' : '1',
 'item_id' : 6,
 'name' : "First rental"
 }
 ]
 'user' : '2',
 'rental_count: 2',
 'rentals' : [
 {
 '_id' : '2',
 'item_id' : 7,
 'name' : "Second rental"
 },
 {
 '_id' : '3',
 'item_id' : 8,
 'name' : "Third rental"
 },
 ]
}

Как вы можете это сделать с помощью mongodb (при необходимости я могу использовать структуру агрегации).

Я пробовал что-то вроде этого:

self.collection.aggregate([
 {'$group' => {_id: {user_id: '$user_id'},
 rental_items: {'$addToSet' => '$item_id'}
 rental_ids: {'$addToSet' => '$_id'}
 }
]},

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

1 ответ

Этот совокупный запрос, который вы опубликовали, кажется правильным, только вам нужно передать объект в $addToSet:

db.rentals.aggregate({ "$group" : 
 { _id: "$user_id", 
 rental_count : {$sum : 1}, 
 rentals : {'$addToSet' : 
 { "item_id" : '$item_id', 
 "rental_id" : "$_id", 
 "name" : "$name" 
 } 
} } } );

Учитывая ваши данные образца, это приводит к

{
 "result" : [
 {
 "_id" : 2,
 "rental_count" : 2,
 "rentals" : [
 {
 "item_id" : 8,
 "rental_id" : "3",
 "name" : "Third rental"
 },
 {
 "item_id" : 7,
 "rental_id" : "2",
 "name" : "Second rental"
 }
 ]
 },
 {
 "_id" : 1,
 "rental_count" : 1,
 "rentals" : [
 {
 "item_id" : 6,
 "rental_id" : "1",
 "name" : "First rental"
 }
 ]
 }
 ],
 "ok" : 1
}

У этого нет точного наименования, которое вам нужно, но изменение - самая легкая часть, и я не хочу украсть все самое интересное :-)

licensed under cc by-sa 3.0 with attribution.