Я новичок в MongoDB, поэтому, пожалуйста, простите меня, если на этот вопрос есть очевидный ответ...
Контекст:
Я следовал примеру в документации MongoDB для реализации иерархической агрегации. с помощью уменьшения карты. В примере используется «составное» поле _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
ing _id
полями. Например, я хотел бы агрегировать только документы, имеющие тип {u: String, d: Date, hobby: String}
_id
, или только документы с типом _id
{u: String, d: Date}
.
Я знаю, что могу использовать оператор $exists
, чтобы ограничить, какие поля _id
должны и не должны быть разрешены, но я не хочу создавать отдельную агрегацию для каждого _id
(потенциально многих).
Есть ли простой способ программно ограничить $match
ing документы теми, которые содержат (или не содержат) определенные поля в совокупности?