2015-10-19 3 views
0

Я использую этот вопрос, поскольку добавляю более четкое название и дополнительную информацию в сообщении. В настоящее время мой MongoDB состоит из сотен отдельных массивов в одном документе (только один элемент _id), и внутри этих массивов находится все мои данные (снимок экрана находится на изображении ниже).Как пройти сотни массивов в одном документе в MongoDB

enter image description here

Существует набор данных внутри каждого массива под названием «выигрыши», который показывает общий выигрыш для каждого игрока.

The actual data that is within each array.

Так схема для MongoDB, как это:

[{ 
Date: "01/01/2012", 
Entry ($): "2", 
Id: "123456", 
Link: "www.mywebsite.com", 
Opponent: "Opponent" 
}] 

Кроме того, представляется, что все эти массивы имеют только один MongoDB уникальный идентификатор, присоединенные к ним:

enter image description here

Итак, я считаю, что все мои данные, хранящиеся во всех этих массивах, расположены только в одном документе, который связанный только с одним MongoDB _id.

Как бы я мог заполнить все эти множества, чтобы получить сумму выигрышей?

Я пробовал метод агрегации MongoDB через оператор $ sum с помощью методов $ group, но он не работает. Это самая близкая вещь, о которой я могу думать:

Collection.find().forEach(function(){ 

return db.Collection.aggregate([ 
{ $group: {Date:"$Date", total:{$sum:"$Winnings ($)"}}}, 
]) 

}) 

Но, очевидно, это не сработает. Я не нашел один метод, который может перебирать только один документ и сотни массивов. Попытка вставить parseInt внутри функции forEach также похожа на кошмар и, безусловно, не принимается в MongoDB без инструкции $ with. Даже не уверен, что forEach даже подходит для этого. Прохождение через каждый массив по отдельности так меня смущает прямо сейчас.

+1

Вы не можете применять критерии запроса для поддокумента или массива в документе. Используйте оператор разматывания, чтобы сгладить документ и затем заполнить его. Включите образец входных и выходных данных в свой вопрос, если вам нужна помощь в запросе ... – Kar

+0

Хорошо, спасибо. Я попробую. –

+0

агрегат не распознается как функция. Я запускаю версию 2.6 Монго. –

ответ

1

Имея Collection с одним документом, содержащим массив с большим количеством элементов в нем подобно используя файл (JSON) в качестве системы хранения данных. Основное преимущество, которое вы получаете (используя Collection), - это Meteor, что позволяет легко синхронизировать данные между сервером и клиентом (ами).

Итак, для обработки данных (json array) вы не ограничены mongo api. Вы можете реализовать обработку стиля map-reduce с помощью любого javascript, который вам нравится, хотя я бы предложил использовать библиотеку underscore, которая уже поставляется в комплекте с метеорным ядром.

Однако, как уже упоминалось в некоторых случаях, вероятно, лучше разбить документ (например, использовать запрос mongo api, отправить отфильтрованные наборы данных клиентам, упростить их обновление). В этом случае обрабатывайте файл csv по строке, причем каждая строка вставляется в db, все с общим полем documentId.

Папа.parse (untested):

Это должно разделить ваши данные на один документ db на строку файла csv.

var docId = new Mongo.ObjectID()._str; 
Papa.parse(file, { 
    complete: function(results) { 
    results.data.forEach(row){ 
     row.docId = docId; 
     MyCollection.insert(row); 
    } 
    } 
}); 
+0

Спасибо человеку. Я использую Para Parse для анализа документа. Мне нужно будет проверить и посмотреть, как я могу заставить его обрабатывать таким образом, чтобы я мог использовать api MongoDB. –

0

Вы должны рассмотреть возможность размещения предметов как отдельных документов. MongoDB выполняет более быстрый путь по документам, чем массив объектов в одном документе. Кроме того, это намного проще, это хорошая практика, и это необходимо при создании публикаций и подписки.

+0

Это невозможно, я не думаю. Я загружаю файл CSV, затем он разбирается в формате JSON. К сожалению, результаты попадают в массивы под одним документом. –

+0

Возможно. Перебирайте каждую строку в csv и 'Collection.insert (ConvertToJSON (rowData + CommonDocumentId)). Добавьте общий идентификатор документа в каждую строку, чтобы вы могли получить набор документов, принадлежащих одному файлу. – JeremyK

1
var db = Collection.findOne(); 
    var winningsSum = 0; 
    for(x in db) { 
     if(db.hasOwnProperty(x)) { 
      if(x!='_id') { // it's necessary to skip _id, otherwise it returns NaN 
       winningsSum += db[x].winnings; 
      } 
     } 
    } 
    console.log(winningsSum); //sum of winnings 
+0

Я воссоздал вашу базу данных, и она работает. Надеюсь, что у меня не получилось что-то неправильно, сообщите мне, если это сработает для вас. – KG32

+0

В результате это дает мне 0. Кроме того, если вы не возражаете, какова цель 'hasOwnProperty' в вашем решении. Все записи в файле являются строками. Благодарю. –

+0

Хорошо, я думаю, что я сделал что-то не так, пытаясь реплицировать вашу базу данных, я проверю его еще раз. И о hasOwnProperty, он позволяет узнать, находится ли свойство непосредственно в экземпляре объекта или унаследовано от его прототипа. Это безопаснее, тем более, что я пытаюсь найти решение для базы данных, о которой я не знаю. – KG32

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