2012-03-27 6 views
0

Моей структуры документа выглядит следующим образом:счетчика для конкретного ключа в документах

{ 
    "_id" : ObjectId("4f6b0f6aaa294de8ff476bf3"), 
    "BLOODGAS" : [{ 
     "ABG_PH" : 0.0, //<< one 
     "XYZ" : 2.0, 
     "PQR" : 3.0 
    }] 
} 
{ 
    "BLOODGAS" : [{ 
     "ABG_PH" : 1.0, //<< two 
     "XYZ" : 2.0, 
     "PQR" : 3.0 
    }, { 
     "ABG_PH" : 0.0, //<< three 
     "XYZ" : 1.0, 
     "PQR" : 2.0 
    }, { 
     "ABG_PH" : 0.0, //<< four 
     "XYZ" : 5.0, 
     "PQR" : 6.0 
    }], 
    "_id" : ObjectId("4f6b0f11aa294de8ff476bf2") 
} 

Теперь на основе текущей структуры я полностью четыре экземпляров с ключом ABG_PH

Но с помощью следующего запроса Я получаю количество:

db.myCollection.find({ "BLOODGAS.ABG_PH" : 0 }).count(); 

Я должен получите счет , так как у меня есть 3 экземпляра ABG_PH со значением .

Какой запрос мне нужен, чтобы получить счет 3 с вышеуказанными данными.

Обновление: Если это невозможно с помощью простого запроса, могу ли я использовать сокращение карты здесь?

+0

Вы считаете документы не элементами массива внутри своих документов. Поместите элементы массива «BLOODGAS» в отдельную коллекцию и все в порядке. –

+0

@ RemonvanVliet вы имеете в виду, что у вас есть два _collections_? А потом связать их вместе каким-то идентификатором, как реляционной базой данных? – pradeep

+0

Да. Если вы хотите подсчитать встроенные элементы, у вас есть два варианта; 1) разделять коллекции и поддерживать одно- или двунаправленные отношения или 2) запрашивать все документы-кандидаты и делать вкладку встроенного элемента. Последнее не очень хорошо масштабируется из-за ограничений памяти, но может быть уместным, если у вас есть некоторые практические гарантии относительно размера установленного кандидата. –

ответ

1

Если вы все еще находитесь на ранних стадиях разработки , вы можете рассмотреть вопрос об использовании версии 2.1 Dev из Монго, который имеет новую aggregation framework. Я считаю, что для этого примера вы $unwind массива BLOODGAS, а затем группы и считать.

этой функция будет в следующем стабильном 2.2 выпуске

+0

эй спасибо! Я просто проверил документы для 'unwind' [здесь] (http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group), как вы сказали, это часть' 2.1', но не 2.1 получится стабильным, или мне придется подождать некоторое время, а затем на 2.2 на основе [этой дорожной карты] (https://jira.mongodb.org/browse/SERVER#selectedTab=com.atlassian.jira.plugin .system.project% 3Aroadmap-panel) – pradeep

+0

@pradeep 10gen релиз, как и ядро ​​Linux - нечетные числа - это версии разработки и даже производственные. Поэтому, как только они стабилизируют новые функции в 2.1, они разделяют это на 2.2.0 .. –

1

На самом деле у вас есть 2 документа в вашей коллекции, каждая из которых встраивает связанные данные (массив BLOODGAS). Когда вы запрашиваете коллекцию, вы пытаетесь подсчитать номера документов, данные которых соответствуют вашему запросу, не число связанных BLOODGAS. Вы должны разделить BLOODGAS на выделенную коллекцию, чтобы рассчитывать таким образом: (или анализировать массивы на вашем языке разработки или платформе. Но вы не можете рассматривать BLOODGAS в качестве документов.

+0

Как вы думаете, нет прямого запроса? Считаете ли вы, что это возможно с помощью «MapReduce»? – pradeep

+0

Hi Pradeep, MapReduce кажется огромным решением этой проблемы. Я бы порекомендовал взглянуть на функции группировки (db. [Name] .group), что является хорошим способом для агрегирования и подсчета встроенных документов. – theAndroid

+0

http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group – theAndroid

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