Раньше я без проблем создавал виртуальные объекты 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 в инвентаре, я не видел никаких проблем с этим и виртуальными машинами, но могу ошибаться.

Согласно документация мангуста, синтаксис виртуальных машин выглядит так:
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, });