数组中的 mongodb distinct()

wuc*_*ang 4 mongodb array

In my mongodb database,there is only one document below:
  {
      "_id" : ObjectId("5226efc5ccf23796f9590f67"),
      "count" : NumberLong(126045),
      "eissn" : "1466-5034",
      "grade" : 0.0,
      "issn" : "1466-5026",
      "journalAlias" : ["International journal of systematic and evolutionary microbiology", "Int J Syst Evol Microbiol", "Int. J. Syst. Evol. Microbiol."],
      "journalName" : "International journal of systematic and evolutionary microbiology",
      "ccNameCount" : [{
          "ccName" : "ATCC",
          "paperCount" : 1,
          "strainCount" : 2
        }, {
          "ccName" : "ATCC",
          "paperCount" : 3,
          "strainCount" : 4
        }, {
          "ccName" : "BCCM/DCG",
          "paperCount" : 5,
          "strainCount" : 6
        }, {
          "ccName" : "BCCM/IHEM",
          "paperCount" : 0,
          "strainCount" : 0
       }
    }
Run Code Online (Sandbox Code Playgroud)

我想要的是找出有多少不同的 ccNameCout.paperCount 其 ccName 是“ATCC”。所以,在我的 java 代码中,我是这样写的:

coll.distinct("ccNameCount.paperCount",new BasicDBObject("ccNameCount.ccName","ATCC")),

但结果是4, 而不是2

我知道distinct的过程。首先,它搜索ccNameCount.ccName为“ATCC”的集合,然后,它会在这些找到的文档中做一个distinct()。

但我需要的是找到多少个不同的 paperCount,其 ccName 是“ATCC”。任何人都可以帮助我吗?

joa*_*oao 5

我相信实现这一目标的最佳方法是使用聚合框架

db.collection.aggregate(
    {$unwind : "$ccNameCount"},
    {$match : {
                "ccNameCount.ccName" : "ATCC"
    }},
    {$group: {
        _id : "$ccNameCount.paperCount"
    }},
    {$group: {
        _id : "count",
        total : {"$sum" : 1}
    }}
);
Run Code Online (Sandbox Code Playgroud)

这将为您提供结果总计字段中 ccName="ATCC" 的 paperCount 的不同计数。

此外,如果您需要知道除总计数之外的每个不同值,您可以使用$addToSet运算符:

db.collection.aggregate(
    {$unwind : "$ccNameCount"},
    {$match : {
                "ccNameCount.ccName" : "ATCC"
    }},
    {$group: {
        _id : "$ccNameCount.paperCount"
    }},
    {$group: {
        _id : "count",
        total : {"$sum" : 1},
        distinctValues : {$addToSet : "$_id"}
    }}
);
Run Code Online (Sandbox Code Playgroud)