Заполнить коллекцию внутри другой коллекции MongoDB с помощью mongoose nodejs

#node.js #mongodb #mongoose #mongoose-populate

#node.js #mongodb #mongoose #mongoose-заполнить

Вопрос:

Я пытаюсь получить всю информацию от конкретного пользователя. Я уже могу заполнить коллекции, которые она содержит, но я не могу заполнить очень важный атрибут в этих коллекциях, пользователя. У меня есть следующий код, который перепечатывает модели и код, который я уже сделал для запроса. Я также представляю результат того, что я могу получить, и пример того, что я хочу. Спасибо, что помогли мне.

У меня есть следующие шаблоны в Mongoose:

 const schema = new Schema(
{
   .....
    nameEvent:
    {
        type: String,
        required: true
    },
    owner:
    {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    },
    invited:
    [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }],
    participants:
    [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }]
});

module.exports = mongoose.model('Meeting', schema);
  

И:

 const schema = new Schema(
{
    name:
    {
        type: String,
        required: true
    },
   ...
    photoPath:
    {
        type: String,
        required: true
    },
    qrcodePath:
    {
        type: String,
        required: false
    },
    receiveInvites:
    {
        type: Boolean,
        required: true
    },
    invited:
    [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Meeting'
    }],
    participating:
    [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Meeting'
    }],
    owned:
    [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Meeting'
    }]
});

module.exports = mongoose.model('User', schema);
  

Теперь я хочу загрузить всю информацию о пользователе и заполнить некоторые поля, которые мне нужны.

Когда я запускаю следующий код:

 exports.getByid = async(id) =>
{
    const res = await User.findById(id, '_id name photoPath invited participating owned friends')
    .populate('invited', 'nameEvent owner date time numberPlayer participants')
    .populate('participating', 'nameEvent owner date time numberPlayer participants')
    .populate('owned', 'nameEvent owner date time numberPlayer participants');
    return res;
}
  

Я получаю следующий JSON:

 "result": {
  "invited": [],
  "participating": [
    {
      "participants": [
        "5c8a9e46ba60372df4483d2f"
      ],
      "_id": "5c8a9e5dba60372df4483d30",
      "nameEvent": "terças",
      "numberPlayer": 10,
      "date": "19/03/2019",
      "time": "20:00",
      "owner": "5c8a9e46ba60372df4483d2f"
    },
    {
      "participants": [
        "5c8a9e46ba60372df4483d2f"
      ],
      "_id": "5c8aad5eba60372df4483d34",
      "nameEvent": "quintas",
      "numberPlayer": 3,
      "date": "21/03/2019",
      "time": "15:00",
      "owner": "5c8a9e46ba60372df4483d2f"
    }
  ], ....
}
  

Но я хочу больше информации о пользователе-владельце (имя и путь к фотографии).

Как мне заполнить эти дополнительные поля?

Это то, что я ищу:

 {
  "participants": [
    "5c8a9e46ba60372df4483d2f"
  ],
  "_id": "5c8aad5eba60372df4483d34",
  "nameEvent": "quintas",
  "numberPlayer": 3,
  "date": "21/03/2019",
  "time": "15:00",
  "owner": {
    "id":"5c8a9e46ba60372df4483d2f",
    "name":"name User",
    "photoPath": "photoPath.jpg"
  }
}
  

Ответ №1:

Вы не просите, чтобы эти поля были заполнены в вашем коде. Если вы хотите вернуть все поля из объекта, попробуйте что-то вроде этого:

 exports.getByid = async (id) => {
  const res = await User.findById(id, '_id name photoPath invited participating owned friends')
    .populate({ path: 'invited' })
    .populate({ path: 'participating' })
    .populate({ 
        path: 'owned',
        populate: { path: 'owner' }
    });
  return res;
}
  

Взгляните на глубокое заполнение из документов Mongoose.

Комментарии:

1. Большое вам спасибо за всю оказанную вами помощь. С помощью этого кода я уже получил результаты, аналогичные тем, которые я намеревался, с этим я посмотрю, смогу ли я достичь конечной цели. Это мой первый пост здесь. Спасибо вам также за то, что вы неоднократно редактировали ее, чтобы она была явно лучше.

2. Рад помочь @RuiRocha

Ответ №2:

Попробуйте это…

 exports.getByid = async(id) =>
{
    const res = await User.findById(id, '_id name photoPath invited participating owned friends')
    .populate('invited', 'nameEvent owner date time numberPlayer participants')
    .populate('participating', 'nameEvent owner date time numberPlayer participants')
    .populate('owned', 'nameEvent owner date time numberPlayer participants');
    .populate('owned.owner', '_id name photoPath')

    return res;
}
  

Комментарии:

1. Я пробовал это решение. Решение @Don Brody пошло вразрез с моими намерениями, но мне все равно пришлось внести некоторые изменения. Благодарим вас за доступность.