簡體   English   中英

使用貓鼬的一對多關系MongoDb

[英]One to Many Relationship MongoDb Using Mongoose

我正在創建用戶和地址之間的關系。 用戶可以有多個地址。 這是我的架構:

userSchema.js

const mongoose = require('mongoose')
const Schema = mongoose.Schema
const Address = require('./addressSchema')


let userSchema = mongoose.Schema({
  name :String,
  age : Number,
  cohort :String,
  addresses : [{type : Schema.Types.ObjectId, ref : 'Address'}]
})


let User = mongoose.model('User',userSchema)

module.exports = User

addressSchema.js

const mongoose = require('mongoose')

let addressSchema = mongoose.Schema({
  city : String,
  state :String
})

let Address = mongoose.model('Address',addressSchema)
module.exports = Address

添加新用戶和地址(app.js)

let user = new User({name : 'Mary', age : 36, cohort : 2019})
let address = new Address({ city : 'Houston', state : 'TX'})

user.addresses.push(address)


user.save(function(error,newUser){
  console.log(newUser)
})

獲取用戶及其地址 //獲取所有用戶

User.find(function(error,users){

  users.forEach((user) => {
    console.log('addresses')
    user.addresses.forEach((address) => {
      console.log(address.city) // prints undefined
    }) 
  })

})

有什么想法我做錯了嗎?

這取決於您要完成的工作:將地址作為嵌入式文檔存儲在用戶中, 將對地址文檔的引用存儲在用戶中。 上面的示例代碼混合了兩種方法,您已經注意到它們不起作用。


嵌入式:

合並架構:

const mongoose = require('mongoose')
const Schema = mongoose.Schema
const addressSchema = Schema({
    city : String,
    state :String
})'

const userSchema = Schema({
  name :String,
  age : Number,
  cohort :String,
  addresses : [addressSchema]
});

const User = mongoose.model('User',userSchema);

其余代碼可以保持不變。


參考文獻:

現有的架構和模型聲明保持不變。

然后,在存儲數據時,還需要存儲地址:

const user = new User({name : 'Mary', age : 36, cohort : 2019})
const address = new Address({ city : 'Houston', state : 'TX'})

user.addresses.push(address)

Promise.all([
  user.save(),
  address.save()
]).then(([newUser, newAddress]) => {
  console.log({newUser, newAddress});
});

最后,在獲取文檔時,如果要包含該地址,則需要填充該地址:

User.find().populate('addresses').exec().then((users) => {
  users.forEach((user) => {
    user.addresses.forEach((address) => {
      console.log({user, address});
    });
  });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM