Mongo Multikeys в качестве замены индексов? - PullRequest
2 голосов
/ 02 сентября 2011

Я заметил, что для индексации массивов документация MongoDB предлагает использовать Multikeys. Однако в нем ничего не говорится о явном создании мультиключей в качестве индексов. Похоже, что это автоматически. Это верно? Не нужно ли создавать индексы для элементов массива? Должен ли я создать индекс для родительского поля?

http://www.mongodb.org/display/DOCS/Indexes#Indexes-IndexingArrayElements http://www.mongodb.org/display/DOCS/Multikeys

Обновление

Я должен был добавить, что массивы, о которых я говорю, содержат встроенные документы. Вот конкретный пример части документа:

{
 _a: [{
    _aid: "4e5d43698d3a329553111227",
    _an:  true
    _aim: "http://graph.facebook.com/7403766/picture"
    _ana: "Nick ONeill"
      },
       {
    _aid: "4e5d43698d3a329553111228",
    _an:  true
    _aim: "http://graph.facebook.com/129312401/picture"
    _ana: "Joe Peterson"
      }]
 }

1 Ответ

1 голос
/ 02 сентября 2011

Индекс для поля массива или индекс, содержащий поле массива, автоматически является индексом с несколькими ключами.Это означает, что в индексе будет несколько записей, по одной для каждого элемента массива, и одна для массива в целом.Это позволяет сопоставлять отдельные элементы массива, такие как:

db.foo.find({myArrayField: "bar"})

, которые будут соответствовать документам, подобным:

{name: "whatever", myArrayField: ["foo", "bar", "baz"]}

При запросе такого поля MongoDB гарантирует, что любой данный документ будет возвращен только один раз,даже если он совпадает несколько раз:

> db.foo.find({myArrayField: {$in: ["foo", "bar"]}})
{"name" : "whatever", "myArrayField" : [ "foo", "bar", "baz" ]}

Редактировать: Вы можете индексировать массив, который содержит встроенные документы, а также «примитивные» типы.При этом вы можете использовать оператор $elemMatch для поиска частичных совпадений во встроенных документах:

( Примечание об изменении: я обновил примерчтобы продемонстрировать использование $elemMatch с несколькими элементами, когда в запросе используется только одно поле встроенного документа, вам не нужно $elemMatch)

> db.foo.save({name:"a", myArrayField: [{a:1, b:2}, {a:5, b:6}]})
> db.foo.save({name:"b", myArrayField: [{a:1, b:3}]})
> db.foo.save({name:"c", myArrayField: [{a:1, b:1}, {a:5, b:3}]})
> db.foo.find({myArrayField: {a: 1, b: 2}})
{name:"a", myArrayField: [{a:1, b:2}, {a:5, b:6}]}
> db.foo.find({myArrayField: {a: 1}})
// finds nothing, no document has a
// sub-document in myArrayField
// exactly equal to {a: 1}
> db.foo.find({"myArrayField.a": 1})
{name:"a", myArrayField: [{a:1, b:2}, {a:5, b:6}]}
{name:"b", myArrayField: [{a:1, b:3}]}
{name:"c", myArrayField: [{a:1, b:1}, {a:5, b:3}]}
> db.foo.find({myArrayFIeld: {$elemMatch: {a: 1, b: {$gt: 1}}}})
{name:"a", myArrayField: [{a:1, b:2}, {a:5, b:6}]}
{name:"b", myArrayField: [{a:1, b:3}]}
// this does not find document "b", since
// it does not have any sub-documents in
// myArrayField where a is 1 and b is
// greater than 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...