如何在mongodb中仅获取具有3个不同值的文档?

时间:2018-11-08 02:25:05

标签: mongodb mongodb-query

我在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存在?

谢谢您的帮助。

1 个答案:

答案 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阶段以限制数据集。就目前而言,它将进行收集扫描。