Estoy tratando de encontrar todos los documentos, que no tienen una matriz tags o el tamaño de la matriz es menor que 2. ¿Cómo hago esto? Estoy intentando esto, pero no funciona:

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

Es Ruby, por cierto. La versión de MongoDB es 4.

Me estoy poniendo:

unknown operator: $or
2
yegor256 10 may. 2019 a las 19:12

3 respuestas

La mejor respuesta

Puedes usar la consulta a continuación

db.collection.find({
  text: { $exists: true },
  $or: [{
    tags: { $exists: false }
  }, {
    $expr: { $lt: [{ $size: '$tags' }, 2] }
  }]
})
2
Ashh 10 may. 2019 a las 17:30

Para modificar ligeramente la respuesta de MauriRamone a una versión más pequeña:

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

Sin embargo, $where es lento y otras opciones (como el de Anthony) debería preferirse.

Su consulta original no funcionaba porque $or solo funciona en expresiones , no en campos, y necesita un operador $expr para el tamaño.

1
Garrett Motzner 13 may. 2019 a las 18:03

Intente usar $ were en su consulta, así:

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

Estoy usando Robomongo para probar, debe formatear la consulta a Ruby. Saludos.

0
MauriRamone 10 may. 2019 a las 16:46