nodejs-tw / ama

Ask me anything!
MIT License
31 stars 1 forks source link

【已解決】我希望做一個 資料庫,達成 join 的效果 #27

Open weweaaa opened 7 years ago

weweaaa commented 7 years ago

目的

我希望做一個 資料庫,達成 join 的效果

使用的工具

伺服器:node.js + express 模板:hogan 資料庫:MongoDB 連接資料庫工具:Mongoose

操作流程

建立 Model:

var store_info = mongoose.model(
  'store_info', 
  mongoose.Schema({
    store_name: String,
    store_phone: String,
    store_address: String,
    is_delete: {type: Boolean, default: false}
  }, {
    timestamps: {createdAt: 'insert_date', updatedAt: 'update_date'}
  }
), 
'store_info');

var product_info = mongoose.model(
  'product_info', 
  mongoose.Schema({
    product_name: String,
    product_type: String,
    product_price: Number,
    product_size: String,
    product_amount: Number,
    product_picture: String,
    product_date: Date,
    is_delete: {type: Boolean, default: false}
  }, {
    timestamps: {createdAt: 'insert_date', updatedAt: 'update_date'}
  }
), 
'product_info');

var check_list = mongoose.model(
  'check_list', 
  mongoose.Schema({
    store_id: {type: Schema.Types.ObjectId, ref: 'store_info'},
    check_date: Date,
    is_delete: {type: Boolean, default: false},
    detail: [new Schema({
      product_id: {type: Schema.Types.ObjectId, ref: 'product_info'},
      product_price: Number,
      check_amount: Number
    }, {
      timestamps: {createdAt: 'insert_date', updatedAt: 'update_date'}
    })]
  }, {timestamps: {createdAt: 'insert_date', updatedAt: 'update_date'}}
),
'check_list');

程式碼

var model = mongoose.model('check_list');
model.find().populate('store_id').exec();

查詢結果

docs:
[ { _id: 5997e814a524cd07c03f2bd7,
    update_date: 2017-08-19T07:26:12.566Z,
    insert_date: 2017-08-19T07:26:12.566Z,
    __v: 0,
    store_id:
     { _id: 5997e433366d4513b0e420dd,
       update_date: 2017-08-19T07:09:39.783Z,
       insert_date: 2017-08-19T07:09:39.783Z,
       __v: 0,
       store_name: '店2',
       store_phone: '452674',
       store_address: '陸2',
       is_delete: false },
    check_date: 2017-08-19T00:00:00.000Z,
    detail: [ [Object] ],
    is_delete: false } ] 

docs[0].detail:
[ { _id: 5997e814a524cd07c03f2bd8,
    check_amount: 1,
    product_price: 1,
    product_id: 5973311022fbb51034da23d6 } ]

遇到的問題 1

查詢資料回來的結果, check_list.store_id 裡寫的 ref 有正確參考到 store_info 的 model 但是 check_list.detail.product_id 寫的 ref 卻參考失敗

遇到的問題 2

要對 subdocument 裡面下條件查詢,語法是甚麼? 例如:

check_list.find(
  {detail: [{check_amount: 1}]}
)

或是

check_list.detail.find(
  {check_amount: 1}
)

【解決】 問題 1 謝謝大大的解答,解決辦法如下

model.find().populate(['store_id','detail.product_id']).exec();

或是

model.find().populate('store_id').populate('detail.product_id').exec();

【解決】 問題 2 謝謝大大們的解答,解決辦法如下

check_list.find({'detail.check_amount': 1}).exec();
kudorori commented 7 years ago

mongoose的文檔先去全部啃個一遍吧… http://mongoosejs.com/docs/populate.html

dca commented 7 years ago

很好的提問,支持 👍