2013-07-23 2 views
1

Я новичок MongoDB так, пожалуйста, простите меня, если этот вопрос имеет очевидный ответ ...Matching на соединение _id полей в MongoDB агрегате

Контекст:

Я следовал example in the MongoDB docs к реализовать иерархическую агрегацию с использованием map-reduce. В примере используется «соединение» _id поля как карта-ключ сокращения производства агрегатных документов, как это ...

{ 
    _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z") }, 
    value: { 
     ts: ISODate('2010-10-10T15:01:00Z'), 
     total: 254, 
     count: 10, 
     mean: 25.4 } 
} 

Это все хорошо. Для моего конкретного случая использования требуется, чтобы значения для несколько одинаковые ключи испускались каждый map шаг. Например ...

{ 
    _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), hobby: "wizardry" }, 
    value: { 
     ts: ISODate('2010-10-10T15:01:00Z'), 
     total: 254, 
     count: 10, 
     mean: 25.4 } 
} 

{ 
    _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), gender: "male" }, 
    value: { 
     ts: ISODate('2010-10-10T15:01:00Z'), 
     total: 254, 
     count: 10, 
     mean: 25.4 } 
} 

(значения одинаковы, но _id клавиши немного отличаются.)

Это также хорошо.

Вопрос:

Теперь я хотел бы объединить над моими иерархическими коллекциями (просмотр), в которых содержатся документы, имеющие несколько различных составных _id полеев, но только по документам с $match ИНГ _id поля. Например, я хотел бы объединить только документы, содержащие {u: String, d: Date, hobby: String} тип _id или только документы с _id типа {u: String, d: Date}.

Я знаю, что я могу использовать оператор $exists чтобы ограничить _id поле должно и не должно быть разрешено, но я не хочу, чтобы создать отдельную агрегацию для каждого _id (потенциально много).

Есть ли простой способ программного ограничения $match документов, содержащих документы, содержащие (или не содержащие) конкретные поля в совокупности?

ответ

1

Я думаю, что лучший способ решить эти проблемы - это сохранить ваши данные по-разному. Ваш тип «_id» имеет произвольные значения в качестве ключа, и это то, что вам следует избегать. Я бы, вероятно, хранить документы, как:

{ 
    _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), type: hobby, value: "wizardry" } 
} 
{ 
    _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), type: gender, value: "male" }, 
} 

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

+0

Достаточно честный, но что делать, если я _have_ должен соответствовать только на поля '_id'? – jonas

+0

Я не понимаю этого вопроса ... – Derick

+0

В моем случае поля '_id 'не так просты, как я сделал их здесь (например, отличающиеся одним полем). Мой вопрос заключается в том, как '$ match' (потенциально используя оператор' $ exist') на основе полей, присутствующих (и не присутствующих) в поле '_id', без необходимости перечислять все возможные комбинации полей. Итак, при условии шаблона '_id'" я хотел бы агрегировать _just_ над документами, имеющими поле '_id', соответствующее шаблону. – jonas

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