2017-04-21 47 views
0

我有以下模式:如何填充由Mongoose中的composite _id引用的字段?

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是具有相同屬性的比較的對象。然後,我想填充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字段,它們實際上是不同的。

我認爲貓鼬還沒有實施這種類型的人口。我如何將兩個模式聯繫起來以在查詢中獲取組合數據?

回答

1

docs

注:物件,數字,字符串,和緩衝區有效用作參考文獻。

你需要這個$lookup

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

感謝您的回答,但我得到了同樣的結果。最後,我選擇在單獨的進程中選擇初始查詢中提到的所有Works,將它們逐個添加到HoursWorked(以舊式)。主要的問題是在一個需要關係數據庫的項目中選擇MongoDB(熱衷於新穎性)。 – Rodrigo

+0

不客氣,但這應該工作。如果你不介意的話,你應該分享你的查詢。我測試了這個代碼。如果您願意,我可以添加測試數據。 – Veeram