2013-05-28 74 views
2

考慮以下貓鼬模式:如何從兩個條件的子文檔數組中選擇一個元素?

new mongoose.Schema({ 
    attributes: [{ 
     key: { type: String, required: true }, 
     references: [{ 
      value: { type: String, required: true }, 
      reference: { type: mongoose.Schema.Types.ObjectId, required: true } 
     }] 
    } 
}); 

遵循這個模式應該是這樣的文件:

{ 
    attributes: [ 
     { 
      key: 'age', references: [{ value: '35', reference: 298387adef... }] 
     }, 
     { 
      key: 'name', references: [{ 
       value: 'Joe', reference: 13564afde..., 
       value: 'Joey', reference: 545675cdab..., 
     } 
     ... 
    ]   
} 

我想選擇根據以下條件屬性: - 關鍵例如name,例如 - 具有密鑰name的屬性具有至少一個參考,其值爲Joe

理想情況下,我想和這些條件中的許多條件鏈接。例如,{'name': 'Joe'}{'age': '35'}

我似乎無法找到一種做這種貓鼬的方法。我已經試過以下貓鼬查詢,而無需任何的好成績(它讓無論是假陽性或假陰性):

// First query 
query.where('attributes.key', attribute.key); 
query.where('attributes.references.value', attribute.value); 

// Second 
query.and([{ 'attributes.key': attribute.key }, { 'attributes.$.references.value': attribute.value }]); 

// Third 
query.where('attributes', { 'key': attribute.key, 'references.value': { $in: [attribute.value] }}); 

那我怎麼辦呢?

回答

2

您可以使用elemMatch查找包含多個方面匹配的attributes元素文檔:

query.elemMatch(attributes, { key: 'name', 'references.value': 'Joe' }) 
你不能鏈的多個 elemMatch來電在一起的,所以如果你想

和這些你倍數」 d需要使用$and$elemMatch明確構建查詢對象,而不是鏈接Query方法調用。

+0

謝謝!有用。我還沒有理解$ elemMatch實際上是如何工作的。你拯救我的一天:) – Janitrix

相關問題