2

次のようなドキュメント コレクションがあります。

{
  name : "tester"
  , activity: [
    {
      gear: "glasses"
      where: "outside"    
    }
    , {
      gear: "hat"
      , where: "inside"
    }
    , {
      gear: "glasses"
      , where: "car"
    }
  ]
}

コレクションをクエリして、"gear":"glasses" の値を含む複数のアクティビティを含むドキュメントのみを返すにはどうすればよいですか?

ありがとう!

4

3 に答える 3

3

条件でフィルタリングされた完全なドキュメントが必要な場合は、集約フレームワークなしで実行できると思います。

db.collection.find({
    "activity": {$elemMatch: {gear:"glasses"}},
    "activity.1" : {$exists: 1}
})
于 2013-08-31T09:26:03.810 に答える
2

これは集約フレームワークでは見苦しくなりますが、実行できます。

db.collection.aggregate(
  {$match: {"activity.gear": "glasses"}},
  {$unwind: "$activity"},
  {$group: {
    _id: {_id: "$_id", name: "$name"},
    _count: {$sum: {$cond: [{$eq: ["glasses", "$activity.gear"]}, 1, 0]}}
  }},
  {$match: {_count: {$gt: 1}}}
)

上記のクエリを分析するときは、ステップを踏むことをお勧めします。「$match」、「$match」、「$unwind」から始めます。そしてそうです。各ステップがどのように機能するかがわかります。

回答は完全な文書ではありません。完全なドキュメントを探している場合は$project、ダミー アクティビティを通過するステップを含め、出力で完全なドキュメントを再構築します。

于 2013-08-31T03:49:33.543 に答える
1

これを試すこともできます:

db.collection.find( { activity: { $elemMatch: { gear: "glasses" } } )
于 2013-08-31T05:33:05.180 に答える