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 回答