【问题标题】:node js mongoose model populate confusion节点js猫鼬模型填充混乱
【发布时间】:2015-06-20 06:50:54
【问题描述】:

我的场景是从 model 1 (employee.js) 查询 getEmp_onId,这将从 model 2 (empdetails.js) 填充员工详细信息。

问题:

当我在 model 1 (employee.js) 上运行查询时,我得到了员工数据,但 其中没有填充数据

[
  {"_id": "552790d18d3a9810ee5c26c0",
    "username": "demo person"
    "email": "test@example.com"
  }
]

但令人震惊的是,当我直接在 model 2 (empdetails.js) 上运行查询时,我从 model 1 (employee.js) 获得填充数据!!

[
  {"_id": "552ca14069303a15eda1bc95",
    "emp_id": {
        "_id": "552790d18d3a9810ee5c26c0",
        "username": "demo person"
        "email": "test@example.com"
    },
    "city": "demo city",
    "state": "demo state",
    "country": "demo country"
  }
]

谁能解释一下猫鼬模型是如何工作的?

型号:1

employee.js
var mongoose = require('mongoose'); var Schema = mongoose.Schema;
var collection_name = 'employees';

var employee_schema = new Schema({
  _id: {type: Schema.ObjectId}, username: {type: String}, email: {type: String, unique: true},
  emp_details: {type: Schema.Types.ObjectId, ref: 'empdetails'}
});

employee_schema.methods = {
  getEmp_onId: function(empid, cb) {
    this.model(collection_name)
    .find({ _id: empid })
    .populate('emp_details')
    .exec(function(err, res) {
      if(err) { cb(err, null); }
      else { cb(null, res); }
    });
  }
};

型号:2

empdetails.js
var mongoose = require('mongoose'); var Schema = mongoose.Schema;
var collection_name = 'empdetails';

var schema = new Schema({
  _id: {type: Schema.ObjectId},
  emp_id: {type: Schema.Types.ObjectId, ref: 'employees'},
  city: {type: String}, state: {type: String}, country: {type: String}
});

schema.methods = {
  emp_details_by_id: function(empid, cb) {
    this.model(collection_name)
    .find({ emp_id: empid })
    .populate('emp_id')
    .exec(function(err, res) {
      if(err) { cb(err, null); }
      else { cb(null, res); }
    });
  }
};

【问题讨论】:

  • 您如何保存employeeempdetail 模型?
  • 您确定您的employees 文档 引用了empdetails 文档吗?这里没有魔法,如果你不在 emp_details 中存储引用,猫鼬就无法填充它。

标签: mongoose mongoose-populate


【解决方案1】:

我猜你是先保存员工,然后再保存带有员工 ID 的详细信息。这意味着,您的详细信息文档有对员工文档的引用,但员工文档没有参考。你应该这样做:

employee = new employee_model({username: 'username', email: 'email'});
details = new detail_model({emp_id: employee.id, city: 'City'});
employee.emp_details = details.id;
employee.save();
details.save();

【讨论】:

    猜你喜欢
    • 2015-11-19
    • 2018-10-14
    • 2020-06-25
    • 2021-05-16
    • 1970-01-01
    • 2020-11-02
    • 2017-06-27
    • 2021-12-25
    • 2021-06-29
    相关资源
    最近更新 更多