2016-11-04 3 views
0

Я пытаюсь себя научиться MongoDB с большим MongoDB (Каждый документ составляет около 10Mb в общей сложности 1000 документов)MongoDB Совокупный на огромных документах

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

db.getCollection('users').aggregate([ 
    {$group: {_id:"$Activities"}}, 
    {$sort: { UsedCallories: -1}} 
],{allowDiskUse:true}); 

Unfortunatly, когда я исполняю этот сценарий дает мне: "Скрипт выполнен успешно, но нет никаких результатов, чтобы показать.?

Не могли бы вы дать мне указатель, где я ошибаюсь?

Укороченный пример файла:

{ 
    "Id": 1, 
    "FirstName": "Casie", 
    "LastName": "Crapo", 
    "Email": "[email protected]", 
    "Weight": 92, 
    "Length": 198, 
    "Activities": [ 
    { 
     "ActivityType": { 
     "Name": "Sexual Activity", 
     "CallPerSecond": 0.033333333 
     }, 
     "StartCoordinates": { 
     "Lattidude": -10.81907, 
     "Longitude": -16.16832 
     }, 
     "EndCoordinates": { 
     "Lattidude": -10.81907, 
     "Longitude": -16.16832 
     }, 
     "StartDateTime": { $date: "2016-11-01T23:39:15Z" }, 
     "EndDateTime": { $date: "2016-11-02T02:38:45Z" }, 
     "UsedCallories": 772.63042705630426, 
     "Measurements": [ 
     { 
      "Heartrate": 142, 
      "UnderPressure": 123, 
      "Overressure": 156, 
      "Speed": 0, 
      "Coordinates": { 
      "Lattidude": -10.81907, 
      "Longitude": -16.16832 
      } 
     } 
     ] 
    } 
    ] 
} 

Update «ExpectedOutput»:

Таким образом, ожидаемый выход просто список всех видов деятельности во всех областях массива от пользователей. Отсортировано на UsedCallories.

"Activities": [ 
    { 
     "ActivityType": { 
     "Name": "Sexual Activity", 
     "CallPerSecond": 0.033333333 
     }, 
     "StartCoordinates": { 
     "Lattidude": -10.81907, 
     "Longitude": -16.16832 
     }, 
     "EndCoordinates": { 
     "Lattidude": -10.81907, 
     "Longitude": -16.16832 
     }, 
     "StartDateTime": { $date: "2016-11-01T23:39:15Z" }, 
     "EndDateTime": { $date: "2016-11-02T02:38:45Z" }, 
     "UsedCallories": 772.63042705630426, 
     "Measurements": [ 
     ... 
     ] 
    },{ 
     "ActivityType": { 
     "Name": "Sexual Activity", 
     "CallPerSecond": 0.033333333 
     }, 
     "StartCoordinates": { 
     "Lattidude": -10.81907, 
     "Longitude": -16.16832 
     }, 
     "EndCoordinates": { 
     "Lattidude": -10.81907, 
     "Longitude": -16.16832 
     }, 
     "StartDateTime": { $date: "2016-11-01T23:39:15Z" }, 
     "EndDateTime": { $date: "2016-11-02T02:38:45Z" }, 
     "UsedCallories": 52.63042705630426, 
     "Measurements": [ 
     ... 
     ] 
    },{ 
     "ActivityType": { 
     "Name": "Sexual Activity", 
     "CallPerSecond": 0.033333333 
     }, 
     "StartCoordinates": { 
     "Lattidude": -10.81907, 
     "Longitude": -16.16832 
     }, 
     "EndCoordinates": { 
     "Lattidude": -10.81907, 
     "Longitude": -16.16832 
     }, 
     "StartDateTime": { $date: "2016-11-01T23:39:15Z" }, 
     "EndDateTime": { $date: "2016-11-02T02:38:45Z" }, 
     "UsedCallories": 20.22442, 
     "Measurements": [ 
     ... 
     ] 
    } 
    ] 

Update после Дубликат Вопрос

Ладно спасибо за ссылки на дубликате пост. Это не тот же вопрос.

Мне удалось использовать некоторые из них, чтобы получить некоторые результаты. Запрос изменен:

db.getCollection('users').aggregate([ 
    {$unwind: '$Activities'}, 
    {$sort: {'Activities.UsedCallories': -1}}, 
    {$group: {_id: '$_id', 'Activities': {$push: '$Activities'}}} 
    ], { 
    allowDiskUse:true 
}) 

Wich теперь возвращает все действия, сгруппированных ПОЛЬЗОВАТЕЛЕМ, и я предпочел бы просто список всех этих видов деятельности, не сгруппированных Пользователем

+0

try {$ unwind: "$ Activities"} шаг в пути перед группировкой. – Veeram

+0

@Veeram Я попробовал, и он по-прежнему дает то же сообщение. 'db.getCollection ('пользователей') совокупный ([ {$ размотки: "$ деятельность"}., {$ группы: {_ID: "$ деятельность"}}, {$ сортировать: {UsedCallories: -1}}], { allowDiskUse: true }) ' – Kieken72

+0

Можете ли вы добавить ожидаемый результат? – Veeram

ответ

0

Благодаря @chridam. Добавление комментария в качестве ответа.

db.getCollection('users').aggregate([{ 
    $unwind: "$Activities" 
}, { 
    $sort: { 
     "Activities.UsedCallories": -1 
    } 
}, { 
    $group: { 
     _id: null, 
     Activities: { 
      $push: "$Activities" 
     } 
    } 
}, { 
    $project: { 
     _id: 0, 
     Activities: 1 
    } 
}], { 
    allowDiskUse: true 
}); 
+0

Спасибо, он работает, хотя у меня возникает проблема: «BufBuilder пытался увеличить() до 134217728 байт, минуя предел 64 МБ.«Но это будет другой вопрос. Я временно ограничил запрос до 100 записей! – Kieken72

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