如何通过填充字段在猫鼬中查找文档?
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 引用,而是一个字符串。以上是关于如何通过填充字段在猫鼬中查找文档?的主要内容,如果未能解决你的问题,请参考以下文章