Разделение на основе того, существует ли поле или нет

У меня есть данные, которые выглядят так:

{ fname: "bob", age: 33, description: "brown eyes"}
{ fname: "sally", age: 20, description: "tall"}
{ fname: "jim", age: 48 }

Я пытаюсь в одном запросе получить результаты, которые выглядят примерно так:

{
   hasDescription: ["bob", "sally"],
   noDescription: ["jim"]
}

Я играл с $bucketAuto примерно так:

{
  groupBy: { "$cond": [{ "$eq": [ "description", null ] }, true, false ] },
  buckets: 2,
}

но я не имею никакого успеха. Любое руководство будет оценено!

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Запрос

  • группа с выражением на группе, чтобы сделать 2 группы, одну с описанием и одну без (вместо поля для создания группы мы создаем 2 группы на основе условия)
  • остальные 3 этапа - исправить структуру, чтобы она соответствовала ожидаемому результату.

* я не думаю, что вам нужно ведро, ведро для диапазона значений
* вместо приведенного ниже можно также использовать фасет, но фасет похож на запуск агрегации 1 раз для каждого поля, поэтому он медленнее

Плеймонго (наведите курсор мыши на конец каждого этапа => см. in/out каждого этапа)

aggregate(
[{"$group": 
   {"_id": 
     {"$cond": 
       [{"$ne": [{"$type": "$description"}, "missing"]}, "hasDescription",
        "noDescription"]},
    "names": {"$push": "$fname"}}},
 {"$replaceRoot": 
   {"newRoot": 
     {"$cond": 
       [{"$eq": ["$_id", "noDescription"]}, {"noDescription": "$names"},
         {"hasDescription": "$names"}]}}},
 {"$group": {"_id": null, "docs": {"$mergeObjects": "$$ROOT"}}},
 {"$replaceRoot": {"newRoot": "$docs"}}])

Другие вопросы по теме