我正在尝试使用populate
operator Mongoose 合并产品及其用户/所有者。
我制作了产品模式的“导出”模型,指定所有字段,如下所示:
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const someSchema= new Schema({
something1: String,
customers: [{ type: Schema.Types.ObjectId, ref: "customers" }],
price: Number,
...
})
module.exports = mongoose.model("products", someSchema, "products");
我已经设法从产品中的用户/所有者那里保存了 _id
,它在 MongoDB 中显示为橙色 "ObjectId('...')"
罗盘和这个相同的 ID 与“客户”集合中的用户匹配(手动查找)。
但是当我在另一个模块中运行搜索时:
const model = require("../../models/productModel");
model
.populate("customers")
.find({ < some fields> })
.then( ... )
.catch( ... )
它在控制台中抛出以下错误:
TypeError: utils.populate: invalid path. Expected string. Got typeof `undefined`
我是不是漏掉了什么?我尝试了将近一个小时,但一无所获。对不起,如果我错过了一些重要的事情,我有点累了。
非常感谢任何帮助。
最佳答案
我想通了。
问题是我以错误的顺序调用了 populate
。
我在打电话:
model
.populate("customers")
.find({ < some fields> })
.then( ... )
.catch( ... )
但它必须是这样的顺序:
model
.find({ < some fields> })
.populate("customers")
.then( ... )
.catch( ... )
因为我们必须先找到
文档才能填充
它们,否则就没有任何意义。
此外,为了将来引用,如果您只指定 .populate("customers")
,它不会神奇地填充所有 ID 字段,您还必须指定哪个字段。你这样做:
.populate({ path: "key_to_fill", model: "customers" })
现在它会将 key_to_fill
替换为在 customers
中找到的文档。
您可以在此处找到其他参数和选项:https://mongoosejs.com/docs/populate.html (官方文档)
关于mongodb - TypeError : utils. 填充 : invalid path. 预期的字符串。得到类型 `undefined`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53178082/