MongoDB - найти документ, длина массива которого меньше или равна 5 - PullRequest
1 голос
/ 11 апреля 2020

Разве мы не можем передать объект оператору $size в пн goose? Есть ли какие-либо способы запросить массив для длины, чтобы мы могли получить документ, который содержит массив определенной длины.

Это образец документа

    "_id" : ObjectId("5e8c9becd1257f66c4b8cd63"),
    "index" : 0,
    "name" : "Aurelia Gonzales",
    "isActive" : false,
    "registered" : ISODate("2015-02-11T09:52:39.000+05:30"),
    "age" : 20,
    "gender" : "female",
    "eyeColor" : "green",
    "favoriteFruit" : "banana",
    "company" : {
        "title" : "YURTURE",
        "email" : "aureliagonzales@yurture.com",
        "phone" : "+1 (940) 501-3963",
        "location" : {
            "country" : "USA",
            "address" : "694 Hewes Street"
        }
    },
    "tags" : [
        "enim",
        "id",
        "velit",
        "ad",
        "consequat"
    ]
}

Вот запрос

db.admin.aggregate([
    {
        $match : {tags : {$size : {$lte : 5}}}
    }
])

Вот вывод

{
    "message" : "$size needs a number",
    "ok" : 0,
    "code" : 2,
    "codeName" : "BadValue",
    "name" : "MongoError"
}

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Вы не можете использовать $size подобным образом и использовать оператор агрегации $size для этого.

Запрос:

db.collection.find({
  $expr: { /** Allows the use of aggregation expressions within the query language  */
    $lte: [
      {
        $size: "$tags"
      },
      5
    ]
  }
})

Тест: MongoDB-Playground

0 голосов
/ 11 апреля 2020

Хотя, если размер массива достаточно важен, он может быть сохранен в документах и ​​проиндексирован для извлечения гораздо более быстрых результатов.

После аналогичных логи c решение может быть, двухэтапное агрегирование используя $addFields и $size, $lte.

db.collection.aggregate([
  {
    $addFields: {
      sizeOfTags: {
        $size: "$tags"
      }
    }
  },
  {
    $match: {
      sizeOfTags: {
        $lte: 5
      }
    }
  }
])
...