Как найти все документы, у которых нет массива или он меньше чем - PullRequest
2 голосов
/ 10 мая 2019

Я пытаюсь найти все документы, у которых либо нет массива tags, либо размер массива меньше 2. Как мне это сделать?Я пытаюсь это, но не работает:

db.collection.find({
  'text' => { '$exists' => true }, # I need this one too
  'tags' => {
    '$or' => [
      { '$exists' => false },
      { '$lt' => ['$size', 2] }
    ]
  }
})

Это Руби, кстати.Версия MongoDB - 4.

Я получаю:

unknown operator: $or

Ответы [ 3 ]

2 голосов
/ 10 мая 2019

Вы можете использовать ниже запрос

db.collection.find({
  text: { $exists: true },
  $or: [{
    tags: { $exists: false }
  }, {
    $expr: { $lt: [{ $size: '$tags' }, 2] }
  }]
})
1 голос
/ 10 мая 2019

Чтобы немного изменить ответ MauriRamone на уменьшенную версию:

db.getCollection('test').find({
         $and:[
               {"text":{$exists:true} }, 
               {$where: "!this.tags || this.tags.length < 2"}
              ]
         })

Однако, $where медленный, и другие варианты (например, Энтони) должны быть предпочтительными.

Ваш исходный запрос не работал, потому что $or работает только в выражениях , а не в полях, и вам нужен оператор $expr для размера.

0 голосов
/ 10 мая 2019

попробуйте использовать $ были в вашем запросе, как это:

db.getCollection('test').find({
         $and:[
               {"text":{$exists:true} }, 
               {
                $or:[
                    {"tags":{$exists:false}},
                    {$where: "this.tags.length < 2"}
                    ]
               }
               ] 
         })

Я использую Robomongo для тестирования, вы должны отформатировать запрос в Ruby. С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...