Мангуст заполняет виртуалы, производя undefined

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

        const InventorySchema = new mongoose.Schema(
      {
        name: { type: String }, 
        ............
    
      },
      {
        toJSON: { virtuals: true },
        toObject: { virtuals: true },
      }
    );
    
    InventorySchema.virtual('logs', {
      ref: 'Log',
      localField: '_id',
      foreignField: 'inventory',
    });


module.exports = mongoose.model('Inventory', InventorySchema);

А вот и ссылка на схему журнала.

const LogSchema = new mongoose.Schema(
  {
    ...other info,
    inventory: {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Inventory',
    },
  },
  {
    toJSON: { virtuals: true },
    toObject: { virtuals: true },
  }
);

module.exports = mongoose.model('Log', LogSchema);

Вызов inventory.find приводит к undefined, несмотря на то, что записи существуют.

const inventory = await Inventory.findById(req.params.id).populate('logs');
console.info(inventory.populated('logs'));      //undefined
console.info(inventory.logs);                   //undefined


const invLogs = await Log.find({ inventory: inventory._id });
console.info('invLogs: ', invLogs.length);      // 5 - so the records exist

Я искал здесь, но не нашел ответа, который работал бы для меня. Я предполагаю, что делаю что-то не так, но у меня похожие виртуалы есть в других коллекциях. Я должен упомянуть, что использую mongoose-autopopulate в инвентаре, я не видел никаких проблем с этим и виртуальными машинами, но могу ошибаться.

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
25
1

Ответы 1

Согласно документация мангуста, синтаксис виртуальных машин выглядит так:

const userSchema = mongoose.Schema({
  email: String
});
// Create a virtual property `domain` that's computed from `email`.
userSchema.virtual('domain').get(function() {
  return this.email.slice(this.email.indexOf('@') + 1);
});
const User = mongoose.model('User', userSchema);

let doc = await User.create({ email: '[email protected]' });
// `domain` is now a property on User documents.
doc.domain; // 'gmail.com'

В частности, обратите внимание на вызов get(), а параметр - это функция, которая возвращает желаемое значение.

Спасибо, но mongoose populate-virtual дает это в качестве примера: ссылка на сайт. Он использует объект в качестве второго аргумента виртуального объекта для ссылки на другую коллекцию. BandSchema.virtual("members", { ref: "Person", localField: "name", foreignField: "band", justOne: false, });

Louis Mazza 06.04.2021 18:35

Другие вопросы по теме