2013-08-31 91 views
2

我有一个文件集合,如下所示:如何聚集在MongoDB中查询

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

如何查询集合与多只返回文档包含“齿轮”的价值活动:“眼镜”?

谢谢!

+1

可能需要一个展开与和有条件。你有什么尝试? – WiredPrairie

回答

3

我认为这是可能的,而不聚合框架做的,如果你需要完整的文档通过您的病情过滤:

db.collection.find({ 
    "activity": {$elemMatch: {gear:"glasses"}}, 
    "activity.1" : {$exists: 1} 
}) 
+0

这似乎起作用,.1做什么?这是寻找活动数组的长度?我是否也可以用.2来检查它是否有2个“眼镜”? – justin

+0

它检查index1是否存在元素 –

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}}} 
) 

在分析上面的查询,我会建议通过一步走。从“$匹配”,“$匹配”和“$ unwind”开始。还有一个。你会看到每一步如何工作。

答复不是完整的文件。如果您正在查找完整文档,请包括一个经过虚拟活动的$project步骤,并在输出中重新构建完整文档。

1

你也可以试试这个:

db.collection.find({ activity: { $elemMatch: { gear: "glasses" } }) 
+1

这个逻辑没有什么不同:'db.collection.find({“activity.gear”:“glasses”})''。 –