📜  Mongoose Populate() 方法

📅  最后修改于: 2022-05-13 01:56:28.822000             🧑  作者: Mango

Mongoose Populate() 方法

在 MongoDB 中, Population是将一个集合的文档中的指定路径替换为另一个集合的实际文档的过程。

人口需求:每当我们在一个集合的模式中提供对来自任何其他集合的文档的引用(在任何字段中)时,我们需要一个 populate() 方法来用该文档填充该字段。

示例:在下面的示例中,我们有一个userSchema和另一个postSchema ,在postSchema中我们有一个字段postedBy ,它引用来自User模型的文档。

const userSchema = new mongoose.Schema({
    username: String,
    email: String
})

const postSchema = new mongoose.Schema({
    title: String,
    postedBy: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User"
    }
})

const User = mongoose.model('User', userSchema);
const Post = mongoose.model('Post', postSchema);

module.exports = {
    Source, Destination, User, Post
}

安装mongoose:

第 1 步:您可以访问链接 Install mongoose来安装mongoose模块。您可以使用此命令安装此软件包。

npm install mongoose

第 2 步:现在您可以使用以下命令在文件中导入mongoose模块:

const mongoose = require('mongoose');

数据库:最初我们的数据库GFG中有两个集合用户帖子。每个集合都包含一个文档。

最初数据库中的用户和帖子集合

示例 1:我们将在不使用 populate() 方法的情况下执行查询以查找所有帖子。

创建一个文件夹并添加文件main.js ,如下所示:

main.js
// Requiring module
const mongoose = require('mongoose');
  
// Connecting to database
mongoose.connect('mongodb://localhost:27017/GFG',
    {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        useFindAndModify: false
    });
  
// Creating Schemas
const userSchema = new mongoose.Schema({
    username: String,
    email: String
})
  
const postSchema = new mongoose.Schema({
    title: String,
    postedBy: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User"
    }
})
  
// Creating models from userSchema and postSchema
const User = mongoose.model('User', userSchema);
const Post = mongoose.model('Post', postSchema);
  
// Query to find and show all the posts
Post.find()
    .then(p => console.log(p))
    .catch(error => console.log(error));


使用以下命令运行main.js

node main.js

输出:在输出中,我们可以看到在postedBy字段中我们只得到了ObjectId (用户文档的_id 字段),而不是整个文档。

执行 main.js 后在控制台输出

示例 2:我们将使用 populate() 方法执行查询以查找所有帖子。

为了克服上述问题, populate()方法用于将用户ObjectId字段替换为包含所有用户数据的整个文档。为此,我们只需将main.js文件中上述代码中的查询部分替换为:

Post.find()
.populate("postedBy")
.then(p=>console.log(p))
.catch(error=>console.log(error));

笔记: 在 populate() 方法的参数中,我们传递了我们想要用用户数据填充的字段。

输出:使用populate方法后,我们可以看到在输出中我们可以得到posts的postedBy字段内的所有用户数据。

代码中使用populate方法后的输出