2012-09-21 61 views
0

所以我有兩個集合,特質和問題。對於給定的用戶,我遍歷用戶的特點,我想查詢所有的對應於缺少性狀的問題:這工作我可以通過MongoDB匹配對象添加或排序嗎?

linq.From(missingTraits) 
.ForEach(function(trait) 
{ 
    match.$or.push({ "Trait": trait }); 
}); 

database.collection("Questions", function(err, collection) 
{ 
    collection.find(match).limit(2).toArray(function(err, questions) 
    { 
     next(err, questions); 
    }); 
}); 

,但我想的對象來由後整理在特質文檔字段(這是不是有關問題的文件):

Traits 
[ 
    { "Name": "Height", "Value": "73", "Importance": 15 }, 
    { "Name": "Weight", "Value": "230" "Importance": 10 }, 
    { "Name": "Age", "Value": "29", "Importance": 20 } 
] 

Questions 
[ 
    { "Trait": "Height", "Text": "How tall are you?" }, 
    { "Trait": "Weight", "Text": "How much do you weight?" }, 
    { "Trait": "Age", "Text": "How old are you?" } 
] 

所以在上面的例子中,如果所有三個特徵失蹤,我會想帶回只有年齡和身高(按順序)。是否有可能以某種方式修改查詢或匹配對象以促成此操作?

謝謝。

回答

0

如果我正確理解你的問題,你想找到兩個最重要的特徵?如果您的missingTraits數組僅僅是特徵的名稱(「高度」,「重量」,「年齡」),那麼在將查詢發送到Questions集合之前,您需要查詢Traits集合以找到兩個最重要的特徵。

不幸的是,如果沒有對Traits集合的單獨調用,只修改您的Questions集合上的查詢將無法正常工作,因爲那是重要信息存在的地方。

database.collection("Traits", function(err, collection) 
{ 
    collection.find(match).sort({ Importance : -1 }).limit(2).toArray(function(err, traits) 
    { 
     // cache the traits to query the questions collection 
    }); 
}); 

查詢將讓你匹配$或查詢(所有比賽,由遞減順序按重要性排序,限制爲2),這兩個最重要的特徵。然後,您可以使用這些結果查詢Questions集合。

在這種情況下,要告訴Questions集合返回「年齡」,「身高」順序的文檔很困難,所以我建議緩存從Traits集合中收到的特徵的重要性順序,然後對結果進行排序在客戶端的問題上查詢。

下面是文檔的sort()

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Bsort%28%29%7D%7D

最後一兩件事:如果你是通過數據庫調用性狀收集填充missingTraits,那麼它應該是可能的sort()邏輯放到那調用,而不是向該集合添加第二個調用。

相關問題