我在mongodb中具有以下数据:
{
"_id" : ObjectId("111"),
"id" : "111",
"classification" : [
{
"annotator" : "annotatorName1",
"category" : "white"
},
{
"annotator" : "annotatorName2",
"category" : "white"
},
{
"annotator" : "annotatorName3",
"category" : "black"
}
]
}
{
"_id" : ObjectId("222"),
"id" : "222",
"classification" : [
{
"annotator" : "annotatorName1",
"category" : "white"
},
{
"annotator" : "annotatorName2",
"category" : "blue"
},
{
"annotator" : "annotatorName3",
"category" : "black"
}
]
}
{
"_id" : ObjectId("333"),
"kind" : "youtube#video",
"etag" : "tagvalue",
"id" : "333"
}
请注意,classification
标签在我的所有记录中都不存在,如ID为“ 333”的记录中所示。
我需要从数据库中获取所有具有不同category
值的记录。
因此,我需要一个查询,在运行它时,我只会得到带有classification
标签并且具有恰好3个不同 category
值的记录,我想要一个仅将其返回给我的查询:
{
"_id" : ObjectId("222"),
"id" : "222",
"classification" : [
{
"annotator" : "annotatorName1",
"category" : "white"
},
{
"annotator" : "annotatorName2",
"category" : "blue"
},
{
"annotator" : "annotatorName3",
"category" : "black"
}
]
}
我应该在终端中输入什么命令,以获取在category
下存在 3个唯一 classification
值的所有记录,IFF classification
存在?
谢谢您的帮助。
答案 0 :(得分:0)
以下汇总可用于找出具有3个唯一类别的“ id”:
db.collectionName.aggregate([
{$match : {classification : {$exists : true}}},
{$unwind: "$classification"},
{$group: { _id: "$id", uniqueCategories: {$addToSet: "$classification.category"}}},
{$project: {_id : 1, numberOfCategories: {$size: "$uniqueCategories"}} },
{$match: {numberOfCategories: 3} }
])
说明:我们从具有 classification 元素的匹配文档开始。然后我们将其展开,以便将嵌入式数组分解为单独的文档。然后将其按ID分组,并使用$addToSet
将类别收集到一个数组中-这样可以避免重复。然后我们投影其$size
并匹配“等于3”。
此聚合将产生_id设置为集合中文档的id字段的文档,该文档具有3个唯一的类别,您可以使用它们来获取这些文档。如果您的集合很大,则应考虑在开始时添加另一个$match
阶段以限制数据集。就目前而言,它将进行收集扫描。