Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用Mongoose在MongoDB模式中填充子项_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Node.js 如何使用Mongoose在MongoDB模式中填充子项

Node.js 如何使用Mongoose在MongoDB模式中填充子项,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我有两个文档“用户文档”和“用户令牌文档”。这应该像一对多的关系 user.model.js var UserSchema = new Schema({ username: { type: String, unique: true, required: true }, email: { type: String, unique: true, required: tru

我有两个文档“用户文档”和“用户令牌文档”。这应该像一对多的关系

user.model.js

var UserSchema = new Schema({


    username: {

        type: String,
        unique: true,
        required: true

    },
    email: {

        type: String,
        unique: true,
        required: true
    },

    password: {

        type: String,
        required: true
    },

    active: {
        type: Boolean,
        default: false,
    },

    tokens: [{
        type: Schema.ObjectId,
        ref: 'UserToken'
    }],


});

module.exports = mongoose.model('User', UserSchema);
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var UserTokenSchema = new Schema({

    type: {
        type: String
    },

    token: {
        type: String
    },

    expiry: {
        type: Date,
        default: null
    },

    user: [{
        type: Schema.ObjectId,
        ref: 'User'
    }]


});


module.exports = mongoose.model('UserToken', UserTokenSchema);
usertoken.model.js

var UserSchema = new Schema({


    username: {

        type: String,
        unique: true,
        required: true

    },
    email: {

        type: String,
        unique: true,
        required: true
    },

    password: {

        type: String,
        required: true
    },

    active: {
        type: Boolean,
        default: false,
    },

    tokens: [{
        type: Schema.ObjectId,
        ref: 'UserToken'
    }],


});

module.exports = mongoose.model('User', UserSchema);
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var UserTokenSchema = new Schema({

    type: {
        type: String
    },

    token: {
        type: String
    },

    expiry: {
        type: Date,
        default: null
    },

    user: [{
        type: Schema.ObjectId,
        ref: 'User'
    }]


});


module.exports = mongoose.model('UserToken', UserTokenSchema);
用户控制器

var user = new User({

        username: input.username,
        email: input.email,
        password: input.password,
        active: false

});


user.save(function(err) {

        var userToken = new UserToken({

            type: 'new',
            token: token,
            expiry: null,
            user: user._id



        userToken.save(function(err) {

        })
})
当我显示一个用户时,它应该填充/检索与该用户关联的所有令牌。目前还没有这样做

查询

User.find({})
    .populate('tokens') 
    .exec(function(err, users) {

    if(err) return res.json({success: 'false', errors: err});

    return res.json(users);

});
UserToken.find({})
         .populate('user')
         .exec(function(err, tokens) {

    if(err) return res.json({success: 'false', errors: err});

    return res.json(tokens);


});
数据

[
   {
    username: "TestUser",
    email: "TestEmail@hotmail.com",
    password: "$2a$10$I4wJ.e3eVK7EMcfdf46x0e5kYnSTzHPTcBmzXIctduM./pZEiGbPG",
    _id: "56ab4bbfa8f3e11813803566",
    __v: 0,
    tokens: [ ],
    active: false
    }
]
 [


  {
    type: "new",
    token: "16c72da8-78a7-4ee1-9b03-f5e490d7e010",
    _id: "56ab4bbfa8f3e11813803567",
    __v: 0,
    user: [
    {
    username: "TestUser",
    email: "TestEmail@hotmail.com",
    password: "$2a$10$I4wJ.e3eVK7EMcfdf46x0e5kYnSTzHPTcBmzXIctduM./pZEiGbPG",
    _id: "56ab4bbfa8f3e11813803566",
    __v: 0,
    tokens: [ ],
    active: false
    }
    ],
    expiry: null
    }
]
但是,当我显示令牌时,它正在检索关联的用户

查询

User.find({})
    .populate('tokens') 
    .exec(function(err, users) {

    if(err) return res.json({success: 'false', errors: err});

    return res.json(users);

});
UserToken.find({})
         .populate('user')
         .exec(function(err, tokens) {

    if(err) return res.json({success: 'false', errors: err});

    return res.json(tokens);


});
数据

[
   {
    username: "TestUser",
    email: "TestEmail@hotmail.com",
    password: "$2a$10$I4wJ.e3eVK7EMcfdf46x0e5kYnSTzHPTcBmzXIctduM./pZEiGbPG",
    _id: "56ab4bbfa8f3e11813803566",
    __v: 0,
    tokens: [ ],
    active: false
    }
]
 [


  {
    type: "new",
    token: "16c72da8-78a7-4ee1-9b03-f5e490d7e010",
    _id: "56ab4bbfa8f3e11813803567",
    __v: 0,
    user: [
    {
    username: "TestUser",
    email: "TestEmail@hotmail.com",
    password: "$2a$10$I4wJ.e3eVK7EMcfdf46x0e5kYnSTzHPTcBmzXIctduM./pZEiGbPG",
    _id: "56ab4bbfa8f3e11813803566",
    __v: 0,
    tokens: [ ],
    active: false
    }
    ],
    expiry: null
    }
]
如何检索具有所有关联令牌的用户

这应该像一对多的关系

感觉在您的解决方案中,您正在建模一种NN的关系:

var UserSchema = new Schema({
    tokens: [{
        type: Schema.ObjectId,
        ref: 'UserToken'
    }]
...


var UserTokenSchema = new Schema({
    user: [{
        type: Schema.ObjectId,
        ref: 'User'
    }]
...
此外,如何在数据库中插入数据?请记住,没有框架可以理解这种关系,例如,您必须手动执行(每次创建新文档时更新引用)

var u1 = {  ...  }
Users.create(u1, function(err, user) {
  UserTokens.findAndUpdate(userTokenId, {user: user._id}, function(err, uToken){
     // now userToken has the reference to your new user (u1)
  })
})
这应该像一对多的关系

感觉在您的解决方案中,您正在建模一种NN的关系:

var UserSchema = new Schema({
    tokens: [{
        type: Schema.ObjectId,
        ref: 'UserToken'
    }]
...


var UserTokenSchema = new Schema({
    user: [{
        type: Schema.ObjectId,
        ref: 'User'
    }]
...
此外,如何在数据库中插入数据?请记住,没有框架可以理解这种关系,例如,您必须手动执行(每次创建新文档时更新引用)

var u1 = {  ...  }
Users.create(u1, function(err, user) {
  UserTokens.findAndUpdate(userTokenId, {user: user._id}, function(err, uToken){
     // now userToken has the reference to your new user (u1)
  })
})

我更新了我原来的问题,向你展示了我是如何在我的用户控制器中创建用户和用户令牌的。你能告诉我在模式中建立1-N关系的正确方法吗?我现在明白你的意思了,我必须先创建令牌,然后在user.tokens数组中设置令牌id。但是如果在用户创建过程中出现问题,例如发送电子邮件失败,该怎么办。如果没有手动删除我创建的所有内容,它的线性i cn无法恢复到用户未创建时的状态。@KHAN我可以建议您将“userToken”制作为“user”的嵌入式文档吗?我不知道您的应用程序的逻辑,但听起来仍然是一个不错的选择:)您能通过不同的字段(例如令牌)而不是_id来查找嵌入的文档吗?根据我在文档中看到的内容,你看不到,这就是为什么我选择了单独的文档。我更新了我的原始问题,向你展示了我如何在我的用户控制器中创建用户和用户令牌。你能告诉我在模式中建立1-N关系的正确方法吗?我现在明白你的意思了,我必须先创建令牌,然后在user.tokens数组中设置令牌id。但是如果在用户创建过程中出现问题,例如发送电子邮件失败,该怎么办。如果没有手动删除我创建的所有内容,它的线性i cn无法恢复到用户未创建时的状态。@KHAN我可以建议您将“userToken”制作为“user”的嵌入式文档吗?我不知道您的应用程序的逻辑,但听起来仍然是一个不错的选择:)您能通过不同的字段(例如令牌)而不是_id来查找嵌入的文档吗?从我在文档中看到的情况来看,你无法理解这就是为什么我选择了单独的文档。