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