2017-08-21 89 views
1

我欣賞一些幫助。我正在用express和mongodb(v3.4.4)做一個api rest,使用貓鼬(v4.10.5)。我需要做一個聚合操作,但我沒有處理它。我給你看一些代碼。該模型(它有更多的屬性,但我已經離開它簡單):如何使聚合+填充貓鼬

const CategoryModel = mongoose.model('Category', new Schema({ 
    slug: { type: String, unique: true, lowercase: true, index: true }, 
    description: String 
})); 

const MyModel = mongoose.model('MyModel', new Schema({ 
    category: { type: Schema.Types.ObjectId, ref: 'Category' }, 
    other: [{ type: Schema.Types.ObjectId, ref: 'Other' }], 
    times_count: { type: Number, default: 0 } 
})); 

重要的是,我很感興趣的MyModel填入category場,不other場。

假設CategoryMyModel具有良好的記錄。請求:

MyModel.aggregate([ 
    { 
    $group : { 
     _id : '$_id', 
     times: { $sum: '$times_count' } 
    } 
    }, 
    { 
    $limit: 5 
    } 
]).limit(5).exec().then((data) => { 
    console.log(data); 
}).catch((err) => { 
    console.error(err); 
}); 

data是正確的,有5條記錄,但不包括category。現在,我試着用:

MyModel.aggregate([ 
    { 
    $group : { 
     _id : '$_id', 
     times: { $sum: '$times_count' } 
    } 
    }, 
    { 
    $limit: 5 
    }, 
    { 
    $lookup: { 
     from: 'Category', // I tried with 'Categories' and 'categories' 
     localField: 'category', 
     foreignField: '_id', 
     as: 'category' 
    } 
    }, 
    { 
    $unwind: '$category' 
    } 
]).limit(5).exec().then((data) => { 
    console.log(data); 
}).catch((err) => { 
    console.error(err); 
}); 

現在data是空的。我設置了mongoose.set('debug', true);以及它們看起來正確的操作,包括最後的操作aggregate,但是數據是空的...

我不知道我是否解釋得很好。顯然有一些我不完全理解。提前致謝。

回答

1

我在objs中得到所需的記錄,問題是我只帶有_id和times屬性,而我需要填充類別。

這是關於正確的,因爲你沒有明確地添加舞臺加入其他集合。

我已經嘗試添加$項目到$組,但沒有後聚集。

簡而言之,$project用於包含和排除使用一個集合而不是加入的新字段。

您在尋找$lookup這是用於加入一個集合與另一個。當您加入一個新的集合時,每個文檔將有一個新的數組字段,其中包含來自其他集合的「已加入」文檔。

在你的情況下,你的新數組字段將有另一個集合中的一個文檔,所以你可能也想要$unwind

MyModel.aggregate([ 
    { 
     $group : { 
      _id : '$_id', 
      times: { $sum: '$times_count' }, 
      category: { $first: '$category' } 
     } 
    }, 
    /* 
    { 
     $limit: 5 
    }, 
    */ 
    { 
     $lookup: { 
      from: 'Categories', 
      localField: 'category', 
      foreignField: '_id', 
      as: 'category' 
     } 
    }, 
    { 
     $unwind: '$category' 
    } 
]).exec(...); 

在你最初的問題而言,嘗試取消註釋上面,而不是第二階段在你第一次例如使用limit(5)

+0

謝謝,但不工作。我試着用'from:'Category'','localField:'category''和其他組合,我在數組中包含'$ limit',並且沒有'$ unwind' ......總之,有幾十個組合。另外,爲什麼需要光標?我不明白。請注意,我要填充的字段是「MyModel」的「類別」,而不是「_id」。再次感謝。 – lmfresneda

+0

@LuisMiguelF。啊,你說得對,它應該是'category'。你不應該需要'cursor()'如我的例子所示。我還會設置[debug on](http://mongoosejs.com/docs/faq.html#enable_debugging)來查看任何查詢。用類別模式編輯您的問題。你是否也在運行MongoDB v3.2或更高版本? – Mikey

+0

對不起@Mikey,光標是我的錯,我在這個測試中用Mockgoose代替Mongoose(儘管我不知道爲什麼Mockgoose需要一個遊標)。現在,我只使用貓鼬,我會編輯我的問題。還是不行... :( – lmfresneda