猫鼬在Node JS / Express JS中填充

时间:2019-01-31 15:09:58

标签: node.js mongodb express mongoose

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

然后用邮递员创建了一个名为“ example”的用户名; 然后我创建了一个内容随机的帖子,作为作者,我将其设置为“ example”,但似乎不起作用,当我输入“ / test”时它会记录:

  

受欢迎的用户{帖子:[],_ id:5c530cd4ede117109cf1a5e9,
  用户名:“ example”,__ 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")
    })
  });

1 个答案:

答案 0 :(得分:0)

编辑

我现在看到这里发生了什么。看来您有一个循环引用的问题。您的user.posts引用了用户创建的帖子。 posts.author引用创建帖子的作者。如果要执行此操作,则在创建post对象后,必须进入并更新用户对象,然后传递post._id。

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

用户模型

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

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

这将创建虚拟的,并且每当您找到用户并调用.populate('posts')时,您都会获得该用户已编写的帖子数组。

在此处了解有关猫鼬虚拟物品的更多信息:http://thecodebarbarian.com/mongoose-virtual-populate