1. ホーム
  2. mongodb

[解決済み] MongoDB コレクションのオブジェクト配列で、問い合わせた要素のみを取得する

2022-03-21 03:40:35

質問

私のコレクションに次のような文書があるとします。

{  
   "_id":ObjectId("562e7c594c12942f08fe4192"),
   "shapes":[  
      {  
         "shape":"square",
         "color":"blue"
      },
      {  
         "shape":"circle",
         "color":"red"
      }
   ]
},
{  
   "_id":ObjectId("562e7c594c12942f08fe4193"),
   "shapes":[  
      {  
         "shape":"square",
         "color":"black"
      },
      {  
         "shape":"circle",
         "color":"green"
      }
   ]
}


クエリを実行します。

db.test.find({"shapes.color": "red"}, {"shapes.color": 1})

または

db.test.find({shapes: {"$elemMatch": {color: "red"}}}, {"shapes.color": 1})


マッチしたドキュメントを返す (ドキュメント1) ただし、常にすべての配列項目が shapes :

{ "shapes": 
  [
    {"shape": "square", "color": "blue"},
    {"shape": "circle", "color": "red"}
  ] 
}

ただし、ドキュメントを (ドキュメント1) を含む配列のみを使用します。 color=red :

{ "shapes": 
  [
    {"shape": "circle", "color": "red"}
  ] 
}

どうすればいいのでしょうか?

どのように解決するのですか?

MongoDB 2.2の新機能 $elemMatch プロジェクション演算子によって、返されるドキュメントが 最初 マッチング shapes 要素を使用します。

db.test.find(
    {"shapes.color": "red"}, 
    {_id: 0, shapes: {$elemMatch: {color: "red"}}});

を返します。

{"shapes" : [{"shape": "circle", "color": "red"}]}

2.2 では、この操作は $ projection operator ここで $ は、クエリで指定された配列要素のうち、最初にマッチするもののインデックスを表します。 以下は、上記と同じ結果を返します。

db.test.find({"shapes.color": "red"}, {_id: 0, 'shapes.$': 1});

MongoDB 3.2 アップデート

3.2 リリースから、新しい $filter 集約演算子を使って、投影時に配列にフィルタをかけることができます。 すべて にマッチした場合、最初の1つだけでなく

db.test.aggregate([
    // Get just the docs that contain a shapes element where color is 'red'
    {$match: {'shapes.color': 'red'}},
    {$project: {
        shapes: {$filter: {
            input: '$shapes',
            as: 'shape',
            cond: {$eq: ['$$shape.color', 'red']}
        }},
        _id: 0
    }}
])

結果

[ 
    {
        "shapes" : [ 
            {
                "shape" : "circle",
                "color" : "red"
            }
        ]
    }
]