Nodejs mongoose的populate能不能多重进行?

Nodejs mongoose的populate能不能多重进行?

比如有如下Schema

var Account = new Schema({
    username: String,
    password: String,
    Email: String,
    applyform: [{ type: ObjectId, ref: 'Applyform' }]
});
var Applyform = new Schema({
classid : [{ type: ObjectId, ref: 'Classinfo' }],
price: Number,
applydate: { type: Date, default: Date.now},

});

var Classinfo = new Schema({
classname: String,
createdate: { type: Date, default: Date.now }
});

我现在对Acount进行查找并populate

Account
.findOne({username: 'someone'})
.populate('applyform')
.exec(function (err, res) {
.....
})

结果res.applyform可以读到res.applyform.classid 但我想继续populate读到classname可以么?应该怎么继续populate?


7 回复

当然可以。Mongoose 的 populate 方法支持多重 populate,你可以在第一次 populate 后继续进行其他字段的 populate 操作。以下是如何实现这一需求的示例代码:

示例代码

const Account = require('./models/Account'); // 假设你的模型文件是这样的
const Applyform = require('./models/Applyform');
const Classinfo = require('./models/Classinfo');

// 查找 Account 并首先 populate applyform 字段
Account
  .findOne({ username: 'someone' })
  .populate({
    path: 'applyform',
    model: Applyform,
    populate: {
      path: 'classid',
      model: Classinfo,
    },
  })
  .exec((err, res) => {
    if (err) {
      console.error(err);
      return;
    }

    // 输出结果以验证 populate 是否成功
    console.log(res.applyform); // 现在 res.applyform 中应该包含了 classid 和 classname
  });

解释

  1. path 参数:指定你要 populate 的路径。在这个例子中,我们首先通过 applyform 路径来 populate Applyform 模型。
  2. model 参数:指定要使用的 Mongoose 模型。虽然在某些情况下 Mongoose 可以自动检测到模型,但显式指定模型可以使代码更清晰。
  3. populate 对象:嵌套的 populate 对象允许你进一步 populate 更深层的数据。在这个例子中,我们在 applyform 的基础上进一步 populate classid 字段,这将引用 Classinfo 模型。

结果

执行上述代码后,res.applyform 将包含 classid 字段,并且这些 classid 字段会进一步被填充为完整的 Classinfo 文档,包括 classname 字段。这样你就可以访问到嵌套文档中的所有相关信息了。

这种方法使得你可以轻松地处理复杂的多级关联数据结构。


不支持,只能手工来处理

咋手工处理

可以的,你去mongoose官网查,是在pop里传入object,继续往下pop,另外,pop的参数很多,很方便,不是单单的一个string 自豪地采用 CNodeJS ionic

Mongoose可以这样查的说


`` javascript

Schema .find({title:‘Cnodejs社区’}) .populate({ path: ‘User’, populate({ path: ‘Article’ }) }) .exec((err,resultData)=>{ // TODO }); ``

不好意思,才发现这是1年前的帖子

是的,Mongoose 的 populate 方法可以多重进行。你可以通过链式调用来实现多级关联的填充。

以下是你的例子中如何实现 applyformclassid 的多重 populate:

Account
  .findOne({ username: 'someone' })
  .populate({
    path: 'applyform',
    populate: {
      path: 'classid',
      model: 'Classinfo'
    }
  })
  .exec(function(err, res) {
    if (err) {
      console.error(err);
      return;
    }
    
    // 现在 res.applyform.classid 就可以直接访问到 Classinfo 中的属性了
    console.log(res.applyform[0].classid.classname); // 输出某个班级的名字
  });

上述代码片段首先查找指定用户名的 Account 记录,并且在查找的同时填充 applyform 数组中的对象。然后在填充的过程中进一步填充 applyform 数组中的每个对象的 classid 属性,使之指向 Classinfo 集合中的文档。

这样你就可以在 res.applyform 的每个元素上直接访问到 classname 了。

回到顶部