簡體   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