2017-01-29 2 views
1

У меня есть эта Mongoose модель схемыMongoDB найти длину массива больше указанного размера

const postSchema = new Schema({ 

    title: String, 

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

}); 

Я хочу найти модели в базе данных, где headline массива имеет длину, превышающий х

У меня есть этот запрос :

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) 

Кто-нибудь знает, как правильно построить этот запрос? (В моем коде я просто закодировал номер 2 для x.)

ответ

1

Из того, что я прочитал, это невозможно сделать с помощью $size и $gt.

Попробуйте использовать $where - "., Указав n положения, которое в основном говорят, если массив имеет„http://mongoosejs.com/docs/api.html#query_Query-%24where

2

Для наиболее эффективного способа вы можете сделать это с "dot notation по крайней мере,“n + 1 элементов затем вернуть его.

Таким образом, вместо того, чтобы писать { "$gt": 2 } вы вместо того, чтобы искать присутствие значения индекса «третьего» элемента (от нулевого индекса третий 2):

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

Оператор $exists ищет присутствие элемента при этом данном индексе, и когда условие выполняется, то массив должен быть по крайней мере такой длиной и, следовательно, «больше чем два»

отметить также, что ваш запрос условие хочет совместить несколько свойств в элементе массива, и для этого вы фактически используете $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 } 
Смежные вопросы