web-dev-qa-db-ja.com

配列の最初の項目で一致するように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の単一の文字列を含む別のフィールドを作成できることは承知していますが、それは実際に私がここにいるものではありません。

37
JVG

_imgs.0_が必要だと思います。例えば、あなたのサンプルドキュメントが与えられたら、あなたは言いたい:db.products.find({"imgs.0": "http://foo.jpg"})

配列インデックスの参照は、第1レベルの配列に対してのみ機能することに注意してください。 Mongoは、配列インデックスの検索をこれ以上サポートしていません。

71
poundifdef

配列インデックスにドット表記を使用できます。

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

ドット表記 の関連ドキュメントからの抜粋を次に示します。

MongoDBは、ドット表記を使用して配列の要素にアクセスし、サブドキュメントのフィールドにアクセスします。

ゼロベースのインデックス位置で配列の要素にアクセスするには、配列名をドット(。)とゼロベースのインデックス位置で連結し、引用符で囲みます。

'<array>.<index>'

さらに、関連する array documentation へのリンクがあります。

11
Lix