Как индексирует MongoDB документ, у которого нет поля, использованного в индексе?

Одно из свойств MongoDB состоит тот "schema-less" в том, что он означает, что у меня может быть документ как

{nombre : 'diego'}

в той же коллекции, где есть другой документ как

{nombre : 'diego2', edad : '35'}

Я понимаю, что индексы в MongoDB осуществлены используя b-tree равно как в других базах данных, в котором узлы дерева указывают на документы коллекции. Используя индексы query не нуждается в том, чтобы сделать full table scan коллекции, когда операция тип способствует find или sort тому, чтобы он смог использовать определенный индекс.

Мой вопрос, - какой изюм с документами в коллекцию, которая у них не было бы поля, которое было бы использовано она индекс? Например, какой изюм, если он попробовал индексировать из-за "возраста" в коллекции, у которой есть два документа, которые я поместил наверху?

Документ, у которого нет поля, "теряется" для дерева индексов? Он говорит мне db.coleccion.createIndex({'edad' : 1}) что я не могу создавать индекс?

4
задан 15.03.2016, 18:08
2 ответа

Так как он зависит от формы, в которой ты веришь в индекс. Если ты это создаешь, таким образом:

> db.coleccion.insert({"nombre": "cesar"})
> db.coleccion.insert({"nombre": "diego", "edad": "35"})
> db.coleccion.createIndex({"edad" : 1})

Документы, которые не будут содержать поле, также будут индексированы, у чего может быть попадание в исполнении.

Если ты хочешь индексировать поле, что не будет присутствовать во всех документы коллекции тогда лучшее, он состоял бы в том, чтобы использовать Спарсе Индексес. Но имей в виду следующее поведение:

If в sparse index would result in an незавершил result set for queries and sort operations, MongoDB will not использовал that index unless в hint () explicitly specifies the index.

Что означает, что, если результат query неполный, использовав индекс, MongoDB это не использует если только ты это не покажешь ясно используя cursor.hint().

Например:

> db.coleccion.insert({"nombre": "cesar"})
> db.coleccion.insert({"nombre": "diego", "edad": "35"})
> db.coleccion.createIndex({"edad" : 1}, {sparse: true})
> db.coleccion.find().sort({"edad": -1})
{ "_id" : ObjectId("56e8401b010d418cf416c326"), "nombre" : "diego", "edad" : "35" }
{ "_id" : ObjectId("56e84016010d418cf416c325"), "nombre" : "cesar" }
> db.coleccion.find().sort({"edad": -1}).hint({"edad": 1})
{ "_id" : ObjectId("56e8401b010d418cf416c326"), "nombre" : "diego", "edad" : "35" }

Использовав {sparse: true} в создании индекса, ты убеждаешься индексирования только тех документов, у которых есть индексированное поле.

2
ответ дан 24.11.2019, 14:43
  • 1
    Спасибо снова. Encontr и # 233; ответ на то, что он искал. Оставаться и # 233; оставляя твою как получающий ответ, потому что она очень полная, но я хотел в и # 241; adir собственная одна, чтобы объяснять qu и # 233; случается в структуре, что он осуществляет их и #237; ndices, что является тем, что озадачивало меня. – Diego 31.03.2016, 17:23

В MongoDB поля, которые не существуют в документе, оцениваются в null, и также существует ввод для них (для стоимости null) в B-Tree, который осуществляет этот индекс).

Например, если мы вводим в коллекции объекты

{x : 3}
{x : 55}
{x : 6}
{x : null}
{x : "hola"}
{a : 1} -- no tiene campo "x"
{b : 1} -- no tiene campo "x" tampoco

и мы делаем db.coleccion.createIndex({ x : 1}), сделав потом один db.coleccion.find().sort({x : 1}) мы получим документы (я опускаю _ids из-за ясности и удобства) в порядке.

{x : null}
{a : 1}
{b : 1}
{x : 3}
{x : 6}
{x : 55}
{x : "hello"}

Снова,

если у документа нет этого поля, он оценивается в null, и у этой стоимости также есть вход в дерево, которое осуществляет индекс для этого поля.

А именно, который, хотя у документа не будет поля, стоимость для вышеупомянутого поля оценивает, создав индекс на нем.

Даже если мы приносим вещи немного дальше, если мы создаем индекс в коллекции с выбором { unique: true } у нас не будет мочь быть более одного документа в коллекции, у которой не будет поля, включенного в индекс, так как индекс не допускает стоимость, удвоенную для поля и двух документов, у которых не было выражения поля (оцененный в null) они повторяли бы стоимость null для поля (по крайней мере просвет, что мы использовали выбор sparse, и тогда только docs с этим полем были бы индексированы и у нас могло бы быть более одного документа, у которого не было поля несмотря на имение индекса unique).

2
ответ дан 24.11.2019, 14:43