2013-04-02 95 views
2

我有這兩個簡化的模式,我想「加入」基於IP地址。貓鼬 - 填充其他然後編號

var personSchema = Schema({ 
    name: String, 
    ip: String 
}); 

var logSchema = Schema({ 
    message: String, 
    ip: String 
}); 

它會工作,如果person._id是IP地址。但這不適合我。

目前我已經解決了這個問題,當新的日誌被保存時,我搜索該人並添加對日誌的引用。架構是那麼這樣的:

var logSchema = Schema({ 
    message: String, 
    ip: String, 
    person: { type: Schema.Types.ObjectId, ref: 'Person' } 
}); 

我讀過貓鼬Populate文檔,Document#populatedModel.populate()。我仍然不確定是否有可能。這個例子非常簡單,我使用mapReduce和日誌收集分組,因此人口對我來說會很好。

我也讀過Database references在我看來,唯一的選擇是基於_id填充。但它是純粹的mongodb,也許有另一種可能性使用貓鼬?

是否有可能填充不基於_id字段的查詢?

回答

0

MongoDB不支持連接。所以.populate只是另一個查詢,因此最好的解決方案是手動進行另一個查詢。

+0

千萬要填寫您認爲最好再進行一次查詢,然後在每個日誌記錄中保存人員引用? –

+0

@ Mr.Pohoda它並沒有真正幫助你,因爲你仍然必須做一個單獨的查詢('.populate'爲你做)。維護這種數據庫結構將會更困難。也許我還不夠清楚:使用'.populate'做一個單獨的查詢**而不是**。 – freakish

+0

爲什麼填充使用較少的內存然後findOne?我剛剛查詢了20萬個條目(更大更容易看出差異),而使用填充時我的mongod進程永遠不會超過23%,但是當我使用findOne屬性時,它幾乎可以達到cpu的100%? – Snymax

0

MongoDB 3.2引入了$ lookup聚合。你也可以在貓鼬身上使用它。這是一個如何使用條件find也使用它的一個例子:

Log.aggregate(
     { $match: {log_property: 'value'}}, 
     { $lookup: {from: 'person', localField: 'ip', foreignField: 'ip', as: 'user'} } 
    ).exec(function (err, logs) { 
     if (err) { 
     next(err); 
     } 

     res.json(logs); 
    } 
); 

在上面的例子中,每個日誌user屬性將與人從匹配Person模型文件