为什么 mongoose populate 可以工作,而 virtual populate 却不行?

gol*_*cks 3 mongoose mongodb node.js mongoose-populate mongoose-schema

根据文档,我有以下架构

const toolRecordSchema = new mongoose.Schema({
  userId: { type: mongoose.Schema.Types.ObjectId },
});

toolRecordSchema.virtual("user", {
  ref: "User",
  localField: "userId",
  foreignField: "_id",
  justOne: true,
})
Run Code Online (Sandbox Code Playgroud)

当我填充虚拟时,什么也没有发生:

db.ToolRecord.find().populate("user")
Run Code Online (Sandbox Code Playgroud)

但是,如果我将“ref”添加到userId模式中,然后执行.populate("userId"),它会按预期工作,这意味着问题不在于模型之间的关系,而在于虚拟群体。

有什么想法我做错了什么吗?

如果我添加mongoose.set("debug", true),我可以看到将.populate("user")查询产品添加到猫鼬调试日志中的输出:

users.find({}, { skip: undefined, limit: undefined, perDocumentLimit: undefined, projection: {}})
Run Code Online (Sandbox Code Playgroud)

并添加.populate("userId")(有效的)产品此日志:

users.find({ _id: { '$in': [ new ObjectId("631a1fe960d1f82c7fa51a06") ], [Symbol(mongoose#trustedSymbol)]: true }}, { skip: undefined, limit: undefined, perDocumentLimit: undefined, projection: {}})
Run Code Online (Sandbox Code Playgroud)

这样我们就可以看到问题出在哪里。问题是为什么虚拟人口不起作用?

我正在运行猫鼬6

Sul*_*Sah 6

您需要在和选项virtuals: true上添加选项。toJSONtoObject()

const toolRecordSchema = new mongoose.Schema(
  {
    userId: { type: mongoose.Schema.Types.ObjectId },
  },
  {
    toJSON: { virtuals: true },
    toObject: { virtuals: true },
  },
);
Run Code Online (Sandbox Code Playgroud)