2013-10-17 84 views
1

我想做一個查詢使用遠程網格,所以我將不得不在每個字段上處理排序(asc,desc)。節點 - 貓鼬3.6 - 排序查詢與填充字段

下面是模式:

var customerSchema = new mongoose.Schema({ 
status: {type: mongoose.Schema.Types.ObjectId, ref: 'Status'}, 
contact: {type: mongoose.Schema.Types.ObjectId, ref: 'Contact'} 
}, { collection: 'Customer' }); 

customerSchema.virtual('contactName').get(function() { 
    if (this.contact && this.contact.get) { 
     return this.contact.get('firstName') + ' ' + this.contact.get('lastName'); 
    } 

    return ''; 
}); 

customerSchema.virtual('statusName').get(function() { 
    if (this.status && this.status.get) { 
     return this.status.get('name'); 
    } 

    return ''; 
}); 

customerSchema.set('toJSON', { virtuals: true }); 
customerSchema.set('toObject', { virtuals: true }); 
mongoose.model('Customer', customerSchema); 

// STATUS 
var statusSchema = new mongoose.Schema({}, { collection: 'Status' }); 
mongoose.model('Status', statusSchema); 

// CONTACT 
var contactSchema = new mongoose.Schema({ 
    firstName: String, 
    lastName: String 
}, { collection: 'Contact' }); 
mongoose.model('Contact', contactSchema); 

,這裏是查詢:

exports.customerList = function (predicate ,callback){ 
if (!predicate) predicate = 'name'; 
var Customers = mongoose.model('Customer'); 

Customers.find() 
    .select('name phone address status contact contactName statusName') 
    .populate('status', 'name') 
    .populate('contact', 'firstName lastName') 
    .sort(predicate) 
    .exec(callback); 
}; 

在 '名稱'(所以Customer.name)或 '地址'(排序當查詢工作Customer.address),但無法讓它在'contact.firstName'(應該是Customer.contact.firstName)時工作。

中填入fonction的第四個參數是一個選擇對象至極可以有一個排序的對象,但是這樣做:

.populate('contact', 'firstName lastName', null, { sort {'firstName': 1}}) 

不工作(似乎排序聯繫人列表中的用戶)。

我完全是貓鼬(和mongo)的新手。我正試圖將一個rails projets移植到node/express。

有沒有辦法可以通過contact.firstName來排序我的查詢?

謝謝!

編輯:我最終做了手動排序(Array.sort),但我真的不喜歡這個解決方案。排序是同步的,所以它阻止node.js主線程(糾正我,如果我錯了)。

有什麼我不明白?排序數據集對我來說是一個數據庫問題,而不是應用程序......我對將我的rails應用程序轉換爲node.js抱有很大希望,但似乎有些標準操作(分頁網格)實際上很難實現!

回答

8

由於這些字段只存在於應用程序對象(Mongoose模型實例)中,但是在MongoDB中執行排序,所以無法對虛擬字段或填充字段進行排序。

這是MongoDB不支持連接的主要限制之一。如果您的數據是高度關聯的,那麼您應該考慮使用關係數據庫而不是MongoDB。

+0

因此,在mongo風格下做到這一點的唯一方法是將我的聯繫人放入客戶集合(Customer.contact = {})中?是node.js和例如mySql有很好的集成嗎?有沒有好的辦法來處理它? – Doum

+0

@Doum對,或者像你一樣在你自己的代碼中排序。我沒有使用MySQL與node.js,但也許開始[這裏](http://stackoverflow.com/questions/5818312/mysql-with-node-js)。 – JohnnyHK

+1

我可能太習慣於使用關係數據庫......如果我選擇將聯繫人嵌入到客戶(customer.contact = {})中,是否有辦法在以後獲取所有聯繫人而無需獲取所有客戶?這樣做沒有性能問題?例如,客戶將擁有一個項目列表,如果我嵌入它們(customer.projetcs = [])並且想要列出我的應用程序中的所有項目,我將不得不像Customer.find()那樣執行並獲取每個客戶只是爲了得到他們的項目列表... – Doum