mongodb - TypeError : utils. 填充 : invalid path. 预期的字符串。得到类型 `undefined`

标签 mongodb mongoose

我正在尝试使用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/

相关文章:

ruby - 查询具有大小的 Mongo 嵌入式文档

Spring data MongoDB更新多个字段

javascript - 尽管给出了字段输入,但 Postman 上的验证错误

node.js - Mongoose 引用文档的 TTL 过期

node.js - MongoDB中根据时间段获取数据

javascript - 使用 Mongoose 更新信息,对象内部的数组动态地更新

javascript - 从 JSON 数据将 CSV 文件上传到 S3 存储桶

mongodb - 创建包含 find 子句的 MongoDb View

javascript - meteor 上传清除/重置表单数据

node.js - MongooseJS - 具有过滤和排序功能