如何在MongoDB中保存2个集合之间的引用?

时间:2017-12-10 14:03:20

标签: node.js mongodb

我正在使用Node.js,Mongoose,MongoDb,express开发应用程序。

我有两个模式,一个用于学生,另一个用于片段。我正在使用人口模型population model。我可以创建一个用户,并创建一个片段并将其链接到用户。但我无法链接并保存用户集合中的代码段。

如何链接和保存用户,以便它可以引用他的代码段?

用户和代码段架构

var userSchema = Schema({
name: { type: String, required: true, unique: true },
password: { type: String, required: true },
snippet: [{ type: Schema.Types.ObjectId, ref: 'Snippet' }]
})

var snippetSchema = Schema({
user: {type: Schema.Types.ObjectId, ref: 'User'},
title: String,
body: String,
createdAt: {
type: Date,
require: true,
default: Date.now
}
})

这是我通常在用户注册时保存用户的方式。

 var username = request.body.name
var password = request.body.password
var newUser = new User({
  name: username,
  password: password
})
newUser.save().then(function () {
  console.log('success')

  response.redirect('/')
})

这就是我保存片段的方法,我将它添加到用户.save()函数中,以便它保存片段ref,但它给了我name.save()不是函数错误。

var name = request.session.name.name

  name.save().then(function () {
       // Using a promise in this case
    var newSnippet = new Snippet({
      user: name._id,
      title: title,
      body: snippet
    })

    newSnippet.save().then(function () {
    // Successful
      console.log('success')

      response.redirect('/')
    })
  }).catch(function (error) {

    console.log(error.message)

    response.redirect('/')
  })

1 个答案:

答案 0 :(得分:1)

name.save()不是函数,因为在这种情况下name只是一个字符串,而不是 Mongoose 对象。

一种方法是创建您的用户,然后检索它并添加一个代码段:

var name = request.session.name.name

User.find({ name: name }).then(function (user) {
  // Here you get your user by name
  var newSnippet = new Snippet({
    user: user._id,  // And here you can pass user _id
    title: 'your title',
    body: 'your snippet'
  })

  newSnippet.save()
})