乐闻世界logo
搜索文章和话题

Mongoose 如何使用 populate 返回某些字段?

7 个月前提问
3 个月前修改
浏览次数91

7个答案

1
2
3
4
5
6
7

在 Mongoose 中,populate 方法被用来自动替换文档中的指定路径,通过其他集合中的文档。这是一个非常有用的功能,尤其是处理有关联数据的模型时。

如果您只想返回某些字段,而不是关联文档的所有字段,可以在 populate 方法中使用 select 选项来指定。这样能显著减少查询返回的数据量,提高查询效率。

举一个例子,假设我们有两个模型:BookAuthor。每本书都有一个作者,我们希望查询书籍时只获取作者的名字和年龄,而不是作者文档的所有信息。

javascript
const mongoose = require('mongoose'); const { Schema } = mongoose; const authorSchema = new Schema({ name: String, age: Number, nationality: String }); const bookSchema = new Schema({ title: String, author: { type: Schema.Types.ObjectId, ref: 'Author' } }); const Author = mongoose.model('Author', authorSchema); const Book = mongoose.model('Book', bookSchema); Book.find().populate({ path: 'author', select: 'name age -_id' // 这里指定只返回name和age字段,且不返回_id字段 }).exec((err, books) => { if (err) throw err; console.log(books); // 你将看到,每本书的作者信息仅包含名字和年龄 });

在这个例子中,当我们查询书籍时,我们使用了 populate 方法来填充 author 字段。在 populate 中,我们通过 select 选项指定 "name age -_id",这意味着只返回 nameage 字段,而 _id 字段则不会返回。

这种方法非常适合处理数据表征中需要降低数据冗余和提高效率的场景。

2024年6月29日 12:07 回复

我不完全清楚“返回字段”的含义,但您可以使用查询,lean()以便可以自由修改输出,然后填充两个字段并对结果进行后处理以仅保留您想要的字段:

shell
.lean().populate('user', 'email.address facebook.address') .exec(function (err, subscription){ if (subscription.user.email.address) { delete subscription.user.facebook; } else { delete subscription.user.email; } });
2024年6月29日 12:07 回复

如果您只想为填充的文档返回一些特定字段,则可以通过将字段名称语法作为第二个参数传递给 populate 方法来实现此目的。

shell
Model .findOne({ _id: 'bogus' }) .populate('the_field_to_populate', 'name') // only return the Persons name ...

请参阅Mongoose 填充字段选择

2024年6月29日 12:07 回复

尝试这样做:

shell
applicantListToExport: function (query, callback) { this .find(query).select({'advtId': 0}) .populate({ path: 'influId', model: 'influencer', select: { '_id': 1,'user':1}, populate: { path: 'userid', model: 'User' } }) .populate('campaignId',{'campaignTitle':1}) .exec(callback); }
2024年6月29日 12:07 回复

现在你可以做的是:

shell
.populate('friends', { username: 1, age: 1})
2024年6月29日 12:07 回复

Mongoose 的 .populate() 方法使你能够自动替换文档中指向其他集合文档的路径(通常是 ObjectId)为那些文档本身的内容。这对于执行 MongoDB 上类似于 SQL JOIN 操作的情况特别有用。你可以使用 .populate() 来指定想要包含的特定字段。

这里有个使用 .populate() 方法返回特定字段的基本示例:

假设我们有两个 Mongoose 模型:UserPost。每个 Post 文档都有一个 author 字段,该字段存储了一个对 User 集合中某个文档的引用。如果我们想要获取帖子信息并且加载相关联用户的 usernameemail 字段,我们可以这样做:

javascript
const Post = require('./models/post'); // 假设 './models/post' 是 Post 模型的路径 // 假设我们想要获取一个具体的帖子 Post.findById(postId) .populate({ path: 'author', // 要填充的字段 select: 'username email' // 填充的时候,只返回 'username' 和 'email' 字段 }) .exec((err, post) => { if (err) { // 处理错误... } else { // 'post.author' 现在会包含用户的 'username' 和 'email' 字段 console.log(post); } });

在这个例子中,Post.findById(postId) 用于找到一个特定的帖子。.populate() 被链式调用来指定我们想要填充 author 字段。.populate() 方法中的 select 选项用来限制返回的字段,只返回我们指定的 usernameemail;如果我们不包含 select 选项,那么所有的用户字段都会被返回。

此外,如果你只想排除某个字段,你可以在 select 选项中使用 - 前缀。例如,如果我们想要返回除了密码外的所有用户信息,我们可以这样写:

javascript
.populate({ path: 'author', select: '-password' // 返回除了 'password' 字段的所有字段 })

需要注意的是,在使用 .populate() 方法时,你应该意识到它可能会增加服务器的工作负载,因为需要执行额外的查询来填充这些字段。因此,在考虑性能的情况下,应该谨慎地使用该方法,并尽可能地限制返回的字段数量。

2024年6月29日 12:07 回复

在 Mongoose 中,populate() 方法用于自动替换文档中的指定路径,其中填充了来自其他集合的文档。默认情况下,它会填充所有字段,但如果只需要某些特定字段,可以通过在 populate() 方法中指定 select 选项来实现。

例如,假设我们有两个模型:UserPost。每个 Post 文档都有一个引用 User 文档的 author 字段。如果我们想要查询所有帖子,并且只想填充每个帖子的作者的姓名和电子邮件,而不是作者的所有信息,我们可以这样写:

javascript
const Post = require('./models/post'); Post.find() .populate({ path: 'author', select: 'name email' }) .exec((err, posts) => { if (err) throw err; console.log(posts); });

在这个例子中,populate() 方法的第一个参数是对象,其中 path 指定了要填充的字段(这里是 author),而 select 指定了在填充时需要选择的字段(这里是 nameemail)。

这种方法非常有用,因为它可以减少网络传输的数据量并提高查询效率,特别是当被引用文档有许多不需要的大字段时。它还可以帮助保护敏感信息,只返回必要的数据给客户端。

2024年6月29日 12:07 回复

你的答案