Mon goose Populate () не заполняет массив ObjectIds - PullRequest
0 голосов
/ 03 февраля 2020

Я только что начал с Mon goose и пытаюсь заставить populate () работать на очень простом c примере. В настоящее время у меня есть две модели, модель автомобиля и владельца.

Владелец

const mongoose = require('mongoose')

module.exports = mongoose.model('Owner', mongoose.Schema({
  name: String,
  cars: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Car' }]
}))

Автомобиль

const mongoose = require('mongoose')

module.exports = mongoose.model('Car', mongoose.Schema({
  brand: String
}))

Идея заключается в том, что владелец должен иметь возможность владеть несколько машин. Поэтому я храню ссылку ObjectId для каждого автомобиля в массиве автомобилей владельца.

Owner.findById(ownerId, function (err, owner) {
  if (err) console.log(err)

  const c = new Car({ brand: 'Toyota' })

  owner.cars.push(c)
  owner.save()
  console.log(owner.cars) // prints out an array containing multiple car _ids, everything working so far
})

Затем я хочу заполнить массив автомобилей данными из Car Model (их бренды). Однако, запустив заполнение ниже, вы получите только один документ [{"_id": "....", "brand": "Toyota", "__v": 0}]. Длина массива равна 1, хотя очевидно, что многие Car-идентификаторы сохраняются, если я проверяю базу данных или просто пропускаю заполненный вызов.

Owner.findById(ownerId).populate('cars').exec(function (err, owner) {
  if (err) console.log(err)
  console.log(owner) //this only returns one object 
})

Что я делаю не так? Как вы можете сказать, я немного запутался и был бы признателен за любую помощь. Спасибо!

1 Ответ

0 голосов
/ 03 февраля 2020

Первая проблема, вероятно, была связана с неправильной идентификацией объектов. Поэтому я удалил все из MongoDB и начал все заново (я ничего не изменил в схемах, поэтому проблема не возникла здесь). Поскольку база данных пуста, я создал нового владельца и вставил два идентификатора Car в массив «cars». Затем я снова запустил populate (), и он вернул

[
  {
    cars: [ [Object], [Object] ],
    _id: 5e375dc926cd72641cd60d74,
    name: 'James',
    __v: 0
  }
]

Изначально у меня были некоторые трудности с пониманием, почему я не мог получить доступ к массиву "cars" / почему он всегда возвращался определенным, но потом я понял, благодаря Натан Романо { ссылка } сказал, что это потому, что автомобили "вложены более чем в 2 уровня, поэтому по умолчанию вывод представлен как" [Объект "]. Просто запустив

owner[0].cars

Я получил машины, которые искал, и populate () работал как положено.

...