Обновление:
Для массива с дубликатами можно использовать агрегационный конвейер :
db.collection.aggregate([
{ $match: { age: { $gt: 50 } } },
{ $group: { _id: "", city: { $push: "$residence.city" } } }, // Use $addToSet for unique cities
{ $project: { city: 1, _id: 0 } }
]);
Тест: MongoDB-Playground
Старый:
Вы можете воспользоваться .distinct () , который способ получить уникальные значения для данного поля в виде массива. Давайте рассмотрим этот пример:
Сбор данных:
/* 1 */
{
"_id" : ObjectId("5e6c2331d6be1c3d27afaecb"),
"name" : "ticktock",
"age" : 102.0,
"residence" : {
"street" : "123 Main Street",
"city" : "Gotham"
}
}
/* 2 */
{
"_id" : ObjectId("5e6c2331d6be1c3d27afae22"),
"name" : "ticktock2",
"age" : 99.0,
"residence" : {
"street" : "123 Main Street",
"city" : "Gotham"
}
}
/* 3 */
{
"_id" : ObjectId("5e6c2331d6be1c3d27afaecc"),
"name" : "ticktock3",
"age" : 102.0,
"residence" : {
"street" : "123 Main Street",
"city" : "Metropolis"
}
}
/* 4 */
{
"_id" : ObjectId("5e6c2331d6be1c3d27afaecd"),
"name" : "ticktock4",
"age" : 102.0,
"residence" : {
"street" : "123 Main Street",
"city" : "Minas Tirith"
}
}
/* 5 */
{
"_id" : ObjectId("5e6c2331d6be1c3d27afaece"),
"name" : "ticktock5",
"age" : 10.0,
"residence" : {
"street" : "123 Main Street",
"city" : "SomeCityLess-AGE"
}
}
/* 6 */
{
"_id" : ObjectId("5e6c2331d6be1c3d27afaecf"),
"name" : "ticktock6",
"age" : 50.0,
"residence" : {
"street" : "123 Main Street",
"city" : "someCity-AGE=50"
}
}
/* 7 */
{
"_id" : ObjectId("5e6c2331d6be1c3d27afaed0"),
"name" : "ticktock7",
"age" : 102.0,
"residence" : {
"street" : "123 Main Street",
"city" : "Metropolis"
}
}
/* 8 */
{
"_id" : ObjectId("5e6c2498c16b5679b4043d66"),
"name" : "ticktock8",
"residence" : {
"street" : "123 Main Street",
"city" : "city-No-AGE"
}
}
Запрос:
db.collection.distinct('residence.city')
Результат : Получит массив уникальных значений для данного поля ' Residence.city '.
/* 1 */
[
"Gotham",
"Metropolis",
"Minas Tirith",
"SomeCityLess-AGE",
"city-No-AGE",
"someCity-AGE=50"
]
Итак, давайте представим ваше условие, age: {$gt: 50}
:
Запрос:
db.collection.distinct('residence.city',{age: {$gt:50}})
Результат: Итак, теперь у него есть уникальные названия городов, соответствующие заданным критериям.
/* 1 */
[
"Gotham",
"Metropolis",
"Minas Tirith"
]
Примечание: Как и остаток, как и любой другой запрос к базе данных, вам необходимо иметь правильные индексы для этих двух полей age & Residence. city , если ваши запросы в большей степени направлены на age > 50
, вы можете использовать частичный индекс в поле age , а не в качестве обычного индекса.