2017-07-14 62 views
0

我有了這個架構項的集合:查詢到匹配數組輸入

{ 
    "_id" : "5966edbfca08e4e92c6484f0", 
    "comment" : "....", 
    "demographics" : [ 
     "596066467e492a9b1944a988" 
    ], 
} 

我也有產生這種陣列形式:

[ { name: 'Age', value: '596066467e492a9b1944a988' }, 
{ name: 'Gender', value: '595dc5e856207969bd4a2081' } ] 

我想圖取出一個MongoDB查詢,該查詢返回集合中的匹配數組,其中表單數組結果中的「值」位於「demographics」mongo條目中的數組中。如果有多個匹配,它應該匹配一個「或」。

回答

1

由於您的"demographics"字段純粹是「ObjectId數組」或至少類似構造的數據,因此您真正需要做的唯一事情就是將您的輸入強制爲簡單的值和匹配數組。

$in運算符基本上是應用於單個字段的$or的簡寫形式。所以它需要和值的數組,因爲它的參數被認爲是匹配指定的字段。此外,MongoDB在查詢表單中的「數組」或「單數屬性」之間沒有區別。

但基本轉化爲簡單的值,只需要簡單的.map()

var input = [ 
    { name: 'Age', value: '596066467e492a9b1944a988' }, 
    { name: 'Gender', value: '595dc5e856207969bd4a2081' } 
]; 

var query = { 
    "demographics": { 
    "$in": input.map(i => ObjectId(i.value)) 
    } 
}; 

collection.find(query) 

使用假設,當然,你的實際數據爲ObjectId格式,而不是「字符串」的,但是從任何實際的「表單輸入」 HTTP請求將始終以「字符串」的形式呈現,並且需要將其轉換爲正確的類型才能匹配類型不同的位置。

一些庫如mongoose實際上將「投」的值你,無論是由「推定」,一個提供的值實際上是一個ObjectId或通過檢查定義的「模式」的數據的應用,就是這種情況與貓鼬本身。在這些情況下,您無需自己「投射」數據,因爲發出查詢時會自動完成。

這裏的結果當然是文檔中提供的任意值與文檔中"demographics"屬性的「任意」值匹配的文檔。

+0

太棒了,謝謝! – NickL