2017-01-29 73 views
1

我有這樣的貓鼬模型模式MongoDB中找到數組的長度超過指定大小

const postSchema = new Schema({ 

    title: String, 

    headline: [{ 
    kind: String, 
    id: Schema.Types.ObjectId, 
    content: String, 
    relevance: Number, 
    _id: false 
    }], 

}); 

我想找到模型,其中headline數組的長度大於數據庫更大的X

我有這個疑問:

const query = { 
     'headline.kind': 'topic', 
     'headline.id': topicId, 
     'headline':{ 
      '$size':{ 
       '$gt': x 
      } 
     } 
    }; 

但是當我用這個,我得到:

{ MongooseError: Cast to number failed for value "{ '$gt': 2 }" at path "headline" 
    at CastError (/home/oleg/WebstormProjects/lectal/api/node_modules/mongoose/lib/error/cast.js:26:11) 

任何人都知道構建此查詢的正確方法? (在我的代碼中,我只是硬編碼x的數字2)。

回答

2

因爲你可以用"dot notation做到這一點,最有效的方式,至少’n + 1元素,然後返回。

因此而不是寫{ "$gt": 2 }你,而不是尋找「第三」元素的索引值的情況下(從零指數第三個是2):

{ "headline.2": { "$exists": true } } 

$exists運算符正在查找該給定索引處存在的元素,並且當條件滿足時,該陣列必須至少具有該長度,因此「大於2」

還注意到您的查詢條件希望匹配數組元素上的多個屬性,爲此,您實際上使用$elemMatch,否則條件實際上適用於在數組中匹配任意元素,而不僅僅是與$elemMatch一樣具有「兩個」條件的元素。

{ 
    "headline": { "$elemMatch": { "kind": "topic", "id": topicId } }, 
    "headline.2": { "$exists": true } 
} 

做「動態」,我們只是構建查詢生成從參數的關鍵是:

const query = { 
    "headline": { "$elemMatch": { "kind": "topic", "id": topicId } } 
}; 

query['headline.'+x] = { "$exists": true } 
相關問題