如何通过填充字段在猫鼬中查找文档?

Posted

技术标签:

【中文标题】如何通过填充字段在猫鼬中查找文档?【英文标题】:How to find documents in mongoose by populate field? 【发布时间】:2019-07-17 01:27:25 【问题描述】:

我对猫鼬有疑问。当我将某个字段引用到其他集合时,我失去了按此字段进行搜索的能力。我不知道如何正确描述我的问题,所以请看示例。

架构:

var PostSchema = new Schema(
title: String,
content: String,
url: String,
author:  type: Schema.ObjectId, ref: 'User',
mainImage: String,
type: String
);

查询:

Post.find(author: user._id)
    .then(posts => res.send(posts))
    .catch(err => res.status(500).send(err))

什么都不返回。但是,如果我将“作者”字段更改为字符串,它会起作用,但不会填充。 :(

更新: 我不敢相信。我做了这个:

var PostSchema = new Schema(
title: String,
content: String,
url: String,
author: type: String, ref: 'User',
mainImage: String,
type: String
);

只需将类型更改为字符串。天哪,我无法弄清楚它是如何工作的。猫鼬如何知道我需要在参考集合中比较哪个字段?我的意思是没有直接链接到“_id”字段(见查询)。有人可以解释吗?

更新2:

作者架构:

var UserSchema = new Schema(
id: String,
about: String,
firstname: String,
lastname: String,
email: String,
avatar: String,
city: String,
country: String,
dateOfBirth: String,
password: String,
,

  timestamps: true
)

如您所见,我使用额外的“id”字段只是为了给用户提供简单的数字 id 用于 url(/id1 等)。但我确信这不是问题的根源:)

【问题讨论】:

【参考方案1】:

尝试将type: Schema.ObjectId 更改为type: mongoose.Schema.Types.ObjectId

【讨论】:

帮我一个忙。将您的查找请求更改为查找所有帖子,因此 Post.find(),然后填充作者字段,因此添加到 .populate('author') 的末尾(这是在 find() 和 .then() 之间)。这给了你什么? 它为我提供了所有作者的帖子,正如预期的那样。但是看到更新,我找到了可行的解决方案,但我不明白它是如何工作的 能否将您的作者架构添加到问题中? 所以你可以做的一件事就是去掉你的 id 字段,并用 _id 替换它。您可以在作者模式中定义 _id 字段,如下所示:_id: type: String, required: true, unique: true 。现在在您的数据库中,不是每个作者都被 ObjectId 类型的 _id 引用,而是一个字符串。

以上是关于如何通过填充字段在猫鼬中查找文档?的主要内容,如果未能解决你的问题,请参考以下文章

通过在猫鼬中填充匹配结果来查找文档

如何在猫鼬中填充另一个模型的子文档?

如何在猫鼬中异步填充嵌套对象?

如何仅在猫鼬中使用聚合填充嵌套在对象数组中的字段?

在猫鼬中填充引用到其他字段而不是_id,引用自定义字段而不是_id

如何在猫鼬中填充嵌套实体?