繁体   English   中英

如何使用Mongoose在MongoDB模式中填充子代

[英]How To Populate Children In MongoDB Schema Using Mongoose

我有2个文档:“用户文档”和“ UserToken文档”。 这应该像一对多关系。

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);

usertoken.model.js

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);

user.controller

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);

});

数据

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

但是,当我显示令牌时,它正在检索关联的用户。

询问

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

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

    return res.json(tokens);


});

数据

 [


  {
    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)
  })
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM