MongoDB: Как получить имена объектов в коллекции? - PullRequest
0 голосов
/ 02 ноября 2019

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

Мой вопрос: у меня есть следующая коллекция:

 {
    "_id" : ObjectId("5dbd77f7a204d21119cfc758"),
    "Toyota" : {
            "Founder" : "Kiichiro Toyoda",
            "Founded" : "28 August 1937",
            "Subsidiaries" : [
                    "Lexus",
                    "Daihatsu",
                    "Subaru",
                    "Hino"
            ]
    }
}

{
    "_id" : ObjectId("5dbd78d3a204d21119cfc759"),
    "Volkswagen" : {
            "Founder" : "German Labour Front",
            "Founded" : "28 May 1937",
            "Subsidiaries" : [
                    "Audi",
                    "Volkswagen",
                    "Skoda",
                    "SEAT"
            ]
    }
}

Я хочу получить имя объекта, например, здесь я хочу вернуть [Toyota, Volkswagen]

Я использовал этот метод

var names = {}
db.cars.find().forEach(function(doc){Object.keys(doc).forEach(function(key){names[key]=1})});
names;

, который дал мне следующий результат:

{ "_id" : 1, "Toyota" : 1, "Volkswagen" : 1 }

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

1 Ответ

0 голосов
/ 04 ноября 2019

Я бы посоветовал вам изменить дизайн схемы на что-то вроде:

{
  _id: ...,
  company: {
    name: 'Volkswagen',
    founder: ...,
    subsidiaries: ...,
    ...<other fields>...
}

Затем можно использовать структуру агрегации для достижения аналогичного результата:

> db.test.find()
{ "_id" : 0, "company" : { "name" : "Volkswagen", "founder" : "German Labour Front" } }
{ "_id" : 1, "company" : { "name" : "Toyota", "founder" : "Kiichiro Toyoda" } }

> db.test.aggregate([ {$group: {_id: null, companies: {$push: '$company.name'}}} ])
{ "_id" : null, "companies" : [ "Volkswagen", "Toyota" ] }

Для получения дополнительной информации. подробности см .:

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

...