Запрос MongoDB на соответствие первому элементу массива

Мне известен оператор $in, который, похоже, ищет наличие элемента в массиве, но я хочу найти совпадение только в том случае, если элемент находится в первой позиции в массиве.

Например:

{
    "_id" : ObjectId("0"),
    "imgs" : [
        "http://foo.jpg",
        "http://bar.jpg",
        "http://moo.jpg",
        ]
},
{
    "_id" : ObjectId("1"),
    "imgs" : [
        "http://bar.jpg",
        "http://foo.jpg",
        "http://moo.jpg",
        ]
}

Я ищу запрос, похожий на:

db.products.find({"imgs[0]": "http://foo.jpg"})

Это должно / должно вернуть ObjectId("0"), но не ObjectId("1"), так как оно проверяет только первое изображение в массиве.

Как этого добиться? Я знаю, что могу просто создать отдельное поле, содержащее одну строку для firstImg, но это не совсем то, что мне нужно.


person JVG    schedule 11.11.2013    source источник


Ответы (2)


Я верю, что ты хочешь imgs.0. например, учитывая ваш пример документа, вы хотите сказать: db.products.find({"imgs.0": "http://foo.jpg"})

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

person poundifdef    schedule 11.11.2013
comment
Большой. Под массивом первого уровня вы имеете в виду, что он не будет работать с массивами внутри массивов / массивами внутри объектов › - person JVG; 11.11.2013
comment
Следующее не будет работать: {"images.0.5": "foo.jpg"} {"images.0.aliases.3": "foo.jpg"} Следующее будет работать: {"images.2.name": "foo.jpg"} То есть работает несколько уровней вложенности, но Mongo поддерживает только один уровень индексации массива. - person poundifdef; 11.11.2013
comment
у вас есть ссылка на единственную часть массива первого уровня? - person Sebastien Lorber; 01.06.2015
comment
По крайней мере, в MongoDB версии 3.2.6 проблем с вложенными индексами нет. т.е. в документе: {a: [{b: [1,2]}, [3,4]]}, запрос db.testcollection.find({"a.0.b.1": 1}) работает правильно. - person GoogieK; 27.07.2016
comment
См. Также: $elemMatch: db.products.find({"imgs": {$elemMatch: {"0": "http://foo.jpg"}}}) - person Udi; 04.05.2017
comment
@Udi, вы знаете, устарело ли такое использование в версии 4.2? Я не мог заставить его работать - person Jinglesting; 09.09.2019

Вы можете использовать точечную нотацию для индексов массива:

db.products.find({"imgs.0": "http://foo.jpg"})

Вот выдержка из соответствующей документации по точечной нотации.

MongoDB использует точечную нотацию для доступа к элементам массива и для доступа к полям вложенного документа.

Чтобы получить доступ к элементу массива по позиции индекса с отсчетом от нуля, объедините имя массива с точкой (.) И позицией индекса с отсчетом от нуля и заключите в кавычки:

'<array>.<index>'

Кроме того, вот ссылка на соответствующую документацию по массивам.

person Lix    schedule 11.11.2013