Как получить вложенные документы нескольких документов в мангусте

У меня есть модуль под названием «Организация» с массивом вызовов пользователей, который содержит объекты UserSchema. Теперь мне нужен запрос, чтобы получить всех пользователей из всех документов организации в одном массиве.

Как видите, я новичок в mongodb и обычно использую sql. Но без соединений я не знаю, что делать.

Модуль организации:

const OrganisationSchema = new Schema({
  name: { type: String, required: true },
  users: [UserSchema],
  version: String,
});

module.exports.Organisation = mongoose.model('Organisation', OrganisationSchema);

Пользовательская схема:

module.exports.UserSchema = new Schema({
  name: String,
  roles: [String]
})

Моя первая попытка:

routes.get('/', (req, res, next) => {
Organisation.find().populate('users').exec((err, users) => {
  if (err) res.json(err.message)
  else { res.json(users) }
});

Результат:

[
  {
    "users": [
      {
        "roles": [ "coordinator" ],
        "_id": "5aafcf80dd248f7ef86e0512",
        "name": "Peter"
        "__v": 0
      }
    ],
    "_id": "5aafcf80dd248f7ef86e05cf",
    "name": "DEFAULT",
    "__v": 1
  },
  {
    "users": [
      {
        "roles": [ "admin", "coordinator" ],
        "_id": "5aafcf80dd248f7ef86e0500",
        "name": "Max"
        "__v": 0
      }
    ],
    "_id": "5aafcf80dd248f7ef86e05ce",
    "name": "Organisation_01",
    "__v": 1
  }
]

Что мне нужно:

[
  {
    "roles": [ "coordinator" ],
    "_id": "5aafcf80dd248f7ef86e0512",
    "name": "Peter"
    "__v": 0
  },
  {
    "roles": [ "admin", "coordinator" ],
    "_id": "5aafcf80dd248f7ef86e0500",
    "name": "Max"
    "__v": 0
  }
]

person A. Stretz    schedule 04.04.2018    source источник
comment
Пожалуйста, добавьте свой код   -  person Parth Raval    schedule 04.04.2018


Ответы (2)


Этот

Organization.find(
  {},
  {_id: 0, users: 1}
)

Вернусь

[
  {
    users: {
      roles: ['coordinator'],
      _id: '5aafcf80dd248f7ef86e0512',
      name: 'Peter',
      ....
    },
  },
  {
    users: {
      roles: ['admin', 'coordinator'],
      _id: '5aafcf80dd248f7ef86e0500',
      name: 'Max',
      ....
    },
  },
];

Это не совсем то, что вам нужно, но то, что я нашел, наиболее точно соответствует вашим потребностям.

Вы можете найти больше информации здесь:

В противном случае есть другой подход

// Meaby you will need to add await
const users = Organization.find({}).map((item: any) => item.users);
person avimimoun    schedule 29.04.2021

В mongodb вы можете использовать $lookup для выполнения этой операции.

Изучите $lookup здесь: https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

В мангусте вы можете использовать populate()

Например:

Organization.find().populate('users')

Изучите Populate Mongoose здесь: http://mongoosejs.com/docs/populate.html

person Farhan Tahir    schedule 04.04.2018
comment
Спасибо за Ваш ответ. Моя проблема в том, что populate возвращает мне массив организаций. Он не объединяет всех пользователей в один массив - person A. Stretz; 07.04.2018
comment
@A.Stretz Я думаю, вы хотите получить всех пользователей определенной организации? Поскольку populate возвращает правильные данные, массив пользователей принадлежит соответствующему объекту организации. - person Farhan Tahir; 07.04.2018
comment
Нет, я хочу всех пользователей из всех организаций в 1 массиве, как в примере, который я добавил. Например: если у меня есть 2 организации с 3 пользователями в каждой, я получу массив из 6 пользователей. - person A. Stretz; 07.04.2018