mongoDB オブジェクトの配列に条件を指定して抽出する

mongoDB オブジェクトの配列に条件を指定して抽出する

mongoDBで、オブジェクトの配列に条件を指定して抽出する手順を記述してます。

環境

  • OS Ubuntu 20.04
  • MongoDB 5.0.5

手順

オブジェクトの配列に条件を指定して抽出するには、「$all」と「$elemMatch」を使用します。

db.コレクション名.find( { $all: [{$elemMatch:{条件}}] } )

実際に、以下のデータベース「hoge」にある「bar」というコレクション(テーブル)のドキュメント(レコード)を使用して動作を確認してみます。

> use hoge

> db.bar.find().pretty()

{
        "_id" : ObjectId("61c28310ec08670dc0aacfdb"),
        "name" : "bar1",
        "tags" : [
                "japan",
                "a"
        ],
        "qty" : [
                {
                        "size" : "S",
                        "num" : 10,
                        "color" : "blue"
                },
                {
                        "size" : "M",
                        "num" : 100,
                        "color" : "blue"
                },
                {
                        "size" : "L",
                        "num" : 100,
                        "color" : "green"
                }
        ]
}
{
        "_id" : ObjectId("61c28331ec08670dc0aacfdc"),
        "name" : "bar2",
        "tags" : [
                "tai",
                "b"
        ],
        "qty" : [
                {
                        "size" : "M",
                        "num" : 15,
                        "color" : "red"
                }
        ]
}
{
        "_id" : ObjectId("61c28371ec08670dc0aacfdd"),
        "name" : "bar3",
        "tags" : [
                "usa",
                "c"
        ],
        "qty" : [
                {
                        "size" : "M",
                        "num" : 20,
                        "color" : "red"
                },
                {
                        "size" : "LL",
                        "num" : 200,
                        "color" : "yellow"
                },
                {
                        "size" : "XL",
                        "num" : 250,
                        "color" : "blue"
                }
        ]
}
{
        "_id" : ObjectId("61c284b3ec08670dc0aacfdf"),
        "name" : "bar3",
        "tags" : [
                "usa",
                "c",
                "canada"
        ],
        "qty" : [
                {
                        "size" : "M",
                        "num" : 20,
                        "color" : "red"
                },
                {
                        "size" : "LL",
                        "num" : 200,
                        "color" : "yellow"
                },
                {
                        "size" : "XL",
                        "num" : 250,
                        "color" : "blue"
                }
        ]
}

条件を指定して抽出してみます。

> db.bar.find( {     
    qty: { 
        $all: [         
            { $elemMatch : { size: "M", num: { $gt: 50} } },
            { $elemMatch : { num : 100, color: "green" } }
            ] 
        } 
} ).pretty()

{
        "_id" : ObjectId("61c28310ec08670dc0aacfdb"),
        "name" : "bar1",
        "tags" : [
                "japan",
                "a"
        ],
        "qty" : [
                {
                        "size" : "S",
                        "num" : 10,
                        "color" : "blue"
                },
                {
                        "size" : "M",
                        "num" : 100,
                        "color" : "blue"
                },
                {
                        "size" : "L",
                        "num" : 100,
                        "color" : "green"
                }
        ]
}

取得されていることが、確認できます。

and条件も使用できます。

> db.bar.find({ $and: [{tags:"usa"},{tags:"c"}] }).pretty()

{
        "_id" : ObjectId("61c28371ec08670dc0aacfdd"),
        "name" : "bar3",
        "tags" : [
                "usa",
                "c"
        ],
        "qty" : [
                {
                        "size" : "M",
                        "num" : 20,
                        "color" : "red"
                },
                {
                        "size" : "LL",
                        "num" : 200,
                        "color" : "yellow"
                },
                {
                        "size" : "XL",
                        "num" : 250,
                        "color" : "blue"
                }
        ]
}
{
        "_id" : ObjectId("61c284b3ec08670dc0aacfdf"),
        "name" : "bar3",
        "tags" : [
                "usa",
                "c",
                "canada"
        ],
        "qty" : [
                {
                        "size" : "M",
                        "num" : 20,
                        "color" : "red"
                },
                {
                        "size" : "LL",
                        "num" : 200,
                        "color" : "yellow"
                },
                {
                        "size" : "XL",
                        "num" : 250,
                        "color" : "blue"
                }
        ]
}

抽出されていることが確認できます。