MongoDBでIDが234から始まるサブドキュメント配列からレコードを取得する方法
サブドキュメント(ネストされたドキュメント)の配列から条件に合致するレコードを取得するには、集計パイプライン(aggregate)で $unwind と $push を組み合わせて使用します。さらに、IDが「234」で始まる要素だけを絞り込みたい場合は、正規表現($regex)を活用すると効率的です。
サンプルコレクションの作成
まず、insertOne() メソッドを使って、details というサブドキュメント配列を持つドキュメントを作成しましょう。
> db.demo556.insertOne(
... {
... _id:101,
... details:[
... {
... id:"234336",
... Name:"Chris"
... },
... {
... id:"123456",
... Name:"Bob"
... },
... {
... id:"234987",
... Name:"Carol"
... },
... {
... id:"989768",
... Name:"David"
... },
... {
... id:"234888",
... Name:"Sam"
... },
... {
... id:"847656",
... Name:"John"
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }登録したドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみます。
> db.demo556.find();
実行すると、次のような出力が得られます。
{ "_id" : 101, "details" : [
{ "id" : "234336", "Name" : "Chris" },
{ "id" : "123456", "Name" : "Bob" },
{ "id" : "234987", "Name" : "Carol" },
{ "id" : "989768", "Name" : "David" },
{ "id" : "234888", "Name" : "Sam" },
{ "id" : "847656", "Name" : "John" }
] }サブドキュメント配列からレコードを取得するクエリ
以下は、IDが「234」で始まるサブドキュメントのみを抽出するための集計クエリです。
> db.demo556.aggregate({
... $match: {
... "_id": 101
... }
... }, {
... $unwind: "$details"
... }, {
... $match: {
... "details.id": {
... $regex: /^234/
... }
... }
... }, {
... $group: {
... _id: "$_id",
... "Detail": {
... $push: "$details"
... }
... }
... }).pretty();このパイプラインの処理の流れは以下の通りです。
- $match: まず
_idが 101 のドキュメントに絞り込みます。 - $unwind:
details配列を個々のサブドキュメントに展開します。 - $match + $regex: 正規表現
/^234/により、IDが「234」で始まる要素だけをフィルタリングします。 - $group + $push: フィルタ後の要素を元のドキュメント単位で再グループ化し、配列としてまとめ直します。
実行結果
このクエリを実行すると、IDが「234」で始まる3件のサブドキュメントだけが配列として返されます。
{
"_id" : 101,
"Detail" : [
{
"id" : "234336",
"Name" : "Chris"
},
{
"id" : "234987",
"Name" : "Carol"
},
{
"id" : "234888",
"Name" : "Sam"
}
]
}このように、$unwind で配列を展開してから条件で絞り込み、$group と $push で再構築する手法を使えば、ネストされた配列の中から柔軟に目的のレコードを取り出すことができます。
-
MongoDBでドキュメントからサブドキュメントを削除する方法($pull演算子の使い方)
MongoDBでは、ドキュメント内に埋め込まれたサブドキュメント(ネストされたドキュメント)を削除したいケースがよくあります。そのような場合に便利なのが、$pull 演算子です。$pull は update() メソッドと組み合わせて使用することで、配列から条件に一致する要素を取り除くことができます。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成してみましょう。> db.demo538.insertOne( ... { ... id:101, ... details: ... { ... anotherDetails: ...
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "