Querying MongoDB to match in the first item in an

2019-01-11 13:01发布

问题:

I'm aware of the $in operator, which appears to search for an item's presence in array, but I only want to find a match if the item is in the first position in an array.

For instance:

{
    "_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",
        ]
}

I'm looking for a query akin to:

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

This would/should return the ObjectId("0") but not ObjectId("1"), as it's only checking against the first image in the array.

How can this be achieved? I'm aware I could just create a separate field which contains a single string for firstImg but that's not really what I'm after here.

回答1:

I believe you want imgs.0. eg, given your example document, you want to say: db.products.find({"imgs.0": "http://foo.jpg"})

Be aware that referencing array indexes only works for the first-level array. Mongo doesn't support searching array indexes any deeper.



回答2:

You can use dot notation for array indexes:

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

Here is an excerpt from the relevant documentation for dot notation.

MongoDB uses the dot notation to access the elements of an array and to access the fields of a subdocument.

To access an element of an array by the zero-based index position, concatenate the array name with the dot (.) and zero-based index position, and enclose in quotes:

'<array>.<index>'

Additionally, here is a link to the relevant array documentation.