我有一个Mongoose模式,其数组lists
包含对另一个集合的引用和嵌套的数字数组:
var Schema, exports, mongoose, schema;
mongoose = require("mongoose");
Schema = mongoose.Schema;
schema = new Schema({
name: {
type: String,
required: true,
unique: true,
trim: true
},
lists: [
{
list: {
type: Schema.ObjectId,
require: true,
ref: "List"
},
allocations: [
{
type: Number,
required: true
}
]
}
],
createdAt: {
type: Date,
"default": Date.now
},
updatedAt: {
type: Date
}
});
exports = module.exports = mongoose.model("Portfolio", schema);
但是,如果没有获得populate
,我无法按预期工作TypeError: Cannot read property 'ref' of undefined
。我已经尝试了populate('list')
和populate('lists list')
,但我要么没有正确调用,要么我的架构没有正确形成。如果我只是自己引用这些列表,我就没有这个问题:
lists: [
{
type: Schema.ObjectId,
require: true,
ref: "List"
}
]
但我希望在每个列表旁边都有分配数组。我需要做些什么来获得我想要的行为?
答案 0 :(得分:77)
我找到答案:populate('lists.list')
有效。感谢这个问题:Mongoose populate within an object?
答案 1 :(得分:3)
lists: [
{
list: {
type: Schema.ObjectId,
require: true,
ref: "List"
},
allocations: [
{
type: Number,
required: true
}
]
}
],
=>因为它是一个对象数组,所以您可以执行以下操作:: Portfolio.populate('lists.list');
2。
lists: [
{
type: Schema.ObjectId,
require: true,
ref: "List"
}
]
=>因为它是一个数组,所以您只需执行以下操作-:Portfolio.populate('lists');
答案 2 :(得分:3)
实际答案:
使用此
populate('lists.list')
其他:
这里的列表是对象数组(列表)。 在JS中,您可以这样访问
console.log(lists.list);
和MongoDB语法与JS语法相似,为99%。 因此您也可以使用lists.list对此进行填充。
答案 3 :(得分:1)
// Cart schema
var CartSchema = new mongooseSchema({
productDetails: [
{
productId: {
type: mongoose.Schema.ObjectId,
required: true,
ref:'Product'
},
productCount: Number,
}
],
UserId: {
type: String,
default: '',
required: true,
trim: true,
},
shopId: {
type: String,
default: '',
required: true,
trim: true,
},
});
// add this .populate('productDetails.productId').
db.Cart.find({
UserId: userId,
shopId: shopId
}).populate('productDetails.productId').skip(pagination.skip).limit(pagination.limit).exec(function (error, CartList) {
if (error) {
callback(error, null)
} else {
callback(null, CartList)
}
});
答案 4 :(得分:1)
当嵌套排列我的架构时,填充在我的情况下不起作用
const chatSchema = mongoose.Schema({
chats: [
{
type: Schema.Types.ObjectId,
ref: "ChatMsg" },
],
})
我是怎么解决的
Chat.findOne(
{ customer: req.body.customer, agency: req.body.agency },
(err, chat) => {
if (err) {
res.status(422).send("Our fault");
}
chat.populate("chats").execPopulate(() => {
res.send(chat);
});
}
);
答案 5 :(得分:0)
如果你有嵌套架构
YourSchema.find()
.populate({
path: 'map_data',
populate: {
path: 'location'
}
})
这对我有用