【问题标题】:Mongoose Populate in Node JS/express js在 Node JS/express js 中填充 Mongoose
【发布时间】:2019-06-25 02:10:35
【问题描述】:

我正在尝试在两个猫鼬系列之间建立联系。这样用户的信息存储在一个名为 user 的集合中,而他的内容存储在另一个集合中。 到目前为止,我从here 复制了一些代码并对其进行了编辑;

然后使用 Postman,我创建了一个名为“example”的用户名; 然后我创建了一个包含随机内容的帖子,作为作者,我将其设置为“示例”,但似乎它不起作用,当我得到“/测试”时它会记录:

填充用户{帖子:[],_id:5c530cd4ede117109cf1a5e9,
用户名:'示例',__v:0 }

如您所见,帖子是空的,我应该更改什么来解决这个问题?

     const UserSchema = new mongoose.Schema({
      username: String,
      posts: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Post'
      }]
    })
  const PostSchema = new mongoose.Schema({
      content: String,
      author: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
      }
    })

    function getUserWithPosts(username){
      return User.findOne({ username: username })
        .populate('posts').exec((err, posts) => {
          console.log("Populated User " + posts);
        })
    }

    const Post = mongoose.model('Post', PostSchema, 'posts');
    const User = mongoose.model('User', UserSchema, 'users');

  app.post('/testUser', (req, res) => {
    var username = req.body.username;
    var clientModel = new User({
      username: username,
    });
    clientModel.save(function (error) {
      if (error) {
        console.log(error);
      }
      res.send({
        success: true,
        username: username,
        message: 'account saved successfully!'
      });
    });
  });

  app.post('/testPost', (req, res) => {
    var content = req.body.content;
    var author = req.body.author;
    var clientModel = new Post({
      content: content,
      author: author
    });
    clientModel.save(function (error) {
      if (error) {
        console.log(error);
      }
      res.send({
        success: true,
        content: content,
        author: author,
        message: 'account saved successfully!'
      });
    });
  });



  app.get('/test', (req, res) => {
    res.send({
      posts: getUserWithPosts("example")
    })
  });

【问题讨论】:

  • 您返回的是来自getUserWithPosts 的查询,而不是结果,请尝试将console.log("Populated User " + posts); 换成return posts;
  • @mast3rd3mon 我仍然得到一个空对象
  • 你用.populate位做什么?

标签: node.js mongodb express mongoose


【解决方案1】:

编辑

我现在看到这里发生了什么。看来您有循环引用的问题。您的 user.posts 引用了用户创建的帖子。 posts.author 引用创建帖子的作者。如果你想让这个工作,你必须在创建帖子对象后进入并更新用户对象,并传入 post._id。

你可以做另一件更好的事情。您可以使用虚拟机。 Mongoose 可以计算引用其他集合的值运行时间。这将是我的建议。缺点是,虚拟变量不存储在数据库中,每次需要时都必须显式填充此字段。举个例子:

用户模型

const UserSchema = new mongoose.Schema({
  username: String
})

UserSchema.virtual('posts', {
  ref: 'Post',
  localField: 'username',
  foreignField: 'author',
  justOne: false
});

这将创建虚拟,并且每当您找到用户并调用 .populate('posts') 时,您将获得该用户创作的一系列帖子。

在此处阅读有关 mongoose virtuals 的更多信息:http://thecodebarbarian.com/mongoose-virtual-populate

【讨论】:

    猜你喜欢
    • 2013-02-03
    • 2014-11-09
    • 2016-06-25
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2020-07-01
    相关资源
    最近更新 更多