【问题标题】:How to populate a field referenced by composite _id in Mongoose?如何在 Mongoose 中填充复合 _id 引用的字段?
【发布时间】:2017-09-17 20:09:35
【问题描述】:

我有以下架构:

var WorkSchema = new Schema({
  _id:            Object,  // {client: String, project: Number}
  title:          String,
  description:    String
});

var TimeWorkedSchema = new Schema({
  _id:           Object,  //  {client: String, date: Date}
  work:          {type: Object, ref: 'Work'},  //  {client: String, proyect: Number}
  hours:         Number,
  description:   String
});

var w  = mongoose.model('Work', WorkSchema);
var tw = mongoose.model('TimeWorked', TimeWorkedSchema);

字段Work._idTimeWorked.work 是具有相同属性的可比较对象。然后,我想像往常一样用相应的 Work 数据填充 TimeWorked 模型:

tw.find().populate('work').exec(function(err, res){
    console.log(res);
});

打印:

[{
"_id": {
    "client": "clientX", 
    "date": "2017-04-20T00:00:00.000Z"},
"work": {
    "_id":{                     ┐
        "client": "clientX",    |
        "project": 1},          | invariable
    "title": "ABC",             |
    "description": "defgh"},    ┘
"hours": 4,
"description": "bored"
},{
"_id": {
    "client": "clientY", 
    "date": "2017-04-15T00:00:00.000Z"},
"work": {
    "_id":{                     ┐
        "client": "clientX",    |
        "project": 1},          | invariable
    "title": "ABC",             |
    "description": "defgh"},    ┘
"hours": 8,
"description": "funny"
},{...etc...}
]

如您所见,在所有返回的对象中,填充的 work 字段是同一个对象。

但是,如果我删除填充方法 (tw.find().exec(...)),我会得到原来的 work 字段,它们实际上是不同的。

我认为 Mongoose 没有实现这种类型的人口。如何关联两个模式以在查询中获取组合数据?

【问题讨论】:

    标签: mongoose mongoose-populate


    【解决方案1】:

    来自docs

    注意:ObjectId、Number、String 和 Buffer 都可以作为 refs 使用。

    你需要$lookup 来处理这个。

    tw.aggregate({
          $lookup:
            {
              from: "works", // collection name
              localField: "work",
              foreignField: "_id",
              as: "work"
            }
       }).exec(function(err, res){
        console.log(res);
    });
    

    【讨论】:

    • 感谢您的回答,但我得到了相同的结果。最后,我选择在一个单独的过程中选择初始查询中提到的所有 Works,将它们一一添加到 HoursWorked(旧样式)中。主要问题是在一个确实需要关系数据库的项目中选择了 MongoDB(热衷于新颖性)。
    • 不客气,但这应该有效。如果您不介意,您应该分享您的查询。我已经测试了这段代码。如果您愿意,我可以添加测试数据。
    猜你喜欢
    • 2021-10-04
    • 2020-07-20
    • 2012-01-22
    • 2017-05-21
    • 2017-08-23
    • 2018-05-15
    • 2020-12-01
    • 1970-01-01
    • 2018-12-28
    相关资源
    最近更新 更多