查询MongoDB以匹配数组中的第一项

JVG*_*JVG 37 arrays mongodb mongodb-query

我知道$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",
        ]
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找类似于的查询:

db.products.find({"imgs[0]": "http://foo.jpg"})
Run Code Online (Sandbox Code Playgroud)

这将/应该返回ObjectId("0")但不是ObjectId("1"),因为它只是检查数组中的第一个图像.

怎么能实现这一目标?我知道我可以创建一个单独的字段,其中包含一个字符串,firstImg但这并不是我在此之后的真实情况.

pou*_*def 72

我相信你想要的imgs.0.例如,根据您的示例文档,您想说:db.products.find({"imgs.0": "http://foo.jpg"})

请注意,引用数组索引仅适用于第一级数组.Mongo不支持更深入地搜索数组索引.

  • 以下方法不起作用:`{"images.0.5":"foo.jpg"}``{"images.0.aliases.3":"foo.jpg"}`以下内容适用:`{"图像. 2.name":"foo.jpg"}`也就是说,多层嵌套工作,但Mongo只支持一个级别的"数组索引". (13认同)
  • 你对“唯一的一级数组”部分有什么参考吗? (2认同)
  • 至少在 MongoDB 3.2.6 版本上,嵌套索引没有问题。即在文档上:`{a: [{b: [1,2]}, [3,4]]}`,查询`db.testcollection.find({"a.0.b.1": 1 })` 工作正常。 (2认同)
  • 另见:[`$elemMatch`](https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#op._S_elemMatch):`db.products.find({"imgs": {$ elemMatch: {"0": "http://foo.jpg"}}})` (2认同)

Lix*_*Lix 11

您可以对数组索引使用点表示法:

db.products.find({"imgs.0": "http://foo.jpg"})
Run Code Online (Sandbox Code Playgroud)

以下是点符号相关文档的摘录.

MongoDB使用点表示法来访问数组的元素并访问子文档的字段.

要通过从零开始的索引位置访问数组的元素,请将数组名称与点(.)和从零开始的索引位置连接起来,并用引号括起来:

'<array>.<index>'

此外,这里还有相关阵列文档的链接.