我正在尝试使用populate
operator的猫鼬来合并产品及其用户/所有者。
我制作了产品架构的“导出”模型,并指定了所有字段,如下所示:
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 Compass中,它以橙色"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`
我在这里错过了什么吗?我尝试了将近一个小时,却一无所获。抱歉,如果我错过了重要的事情,我有些累了。
非常感谢您的帮助。
答案 0 :(得分:0)
我知道了。
问题是我打错了电话populate
。
我在打电话:
model
.populate("customers")
.find({ < some fields> })
.then( ... )
.catch( ... )
但这必须必须按以下顺序进行:
model
.find({ < some fields> })
.populate("customers")
.then( ... )
.catch( ... )
因为我们必须先find
个文档才能populate
,否则就没有任何意义。
也供以后参考,如果仅指定.populate("customers")
,则不会神奇地填充所有ID字段,还必须指定哪个字段。您可以这样做:
.populate({ path: "key_to_fill", model: "customers" })
现在它将用key_to_fill
中找到的文档替换customers
。
您可以在此处找到其他参数和选项:https://mongoosejs.com/docs/populate.html(官方文档)