Mongodb 在Mongo中使用Collection.Group()展开

Mongodb 在Mongo中使用Collection.Group()展开,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,我需要展开一个数组,以便使用mongo Collection.group()方法在一些现有代码中执行group by 我有一份文件,如: { "_id" : "5373c4fdcb080a06d471c07b", "Form" : "Form 1", "Values" : { "Name" : "Bob Smith", "FavColors" : [ "green", "blue"

我需要展开一个数组,以便使用mongo Collection.group()方法在一些现有代码中执行group by

我有一份文件,如:

{
    "_id" : "5373c4fdcb080a06d471c07b",
    "Form" : "Form 1",
    "Values" : {
        "Name" : "Bob Smith",
        "FavColors" : [ 
            "green",
            "blue"
        ]
    }
}
我需要展开FavColors数组并按FavColors分组,以获得如下计数:

绿色1
蓝色1

我知道使用聚合框架可以很容易地完成这项工作,但是是否仍然可以使用C#driver中的Collection.Group()或mongo shell中的db.Collection.Group()来展开数组?i、 e.在.group操作符中是否有类似于聚合框架中的$unwind的内容?

这就是您的操作方式:

function groupByFavColors(host){
 var conn = new Mongo(host);
 var db = conn.getDatabase("DB-NAME");

 var res = db.product.aggregate([
     {
         // unwind the array
         $unwind: '$Values.FavColors',
     },
     {
         // group by..
         $group: {
             _id: '$Values.FavColors',

             num_sold: {
                 $sum: 1
             }
         }
     }
 ]);

 printjson(res);

}

print("usage: groupbyFavColors(string host);")

这个答案是使用聚合框架。我遇到的问题是,我有使用.group运算符编写的现有代码,我需要修改这些代码来展开数组。@Brantino答案是正确的,因为$unwind属于聚合框架。您使用了错误的方法。无法使用group方法展开数组,因为它使用文档中的字段“键”进行分组,然后它会为您提供一个reduce方法,您可以在该方法中添加groupby逻辑并返回reduced的聚合值document@NeilLunn我知道$unwind是聚合框架的一部分,但我只能使用一些现有代码的.Group。我试图弄清楚,是否可以修改使用.group的现有代码来展开数组,而无需完全重写以使用聚合框架,但这似乎是不可能的。@Brantino您是否可以在JS(group的reduce/map函数)中迭代嵌套值,然后发出嵌套值,这就像是退绕,但对于组函数来说……伙计,组函数对于编码该块的人来说是一个非常糟糕的选择。没有,
$unwind
是聚合框架的一个操作符,它是更好的使用方法。Gyp()//Cux>方法是基于JavaScript的,而不是聚合框架所使用的本机C++实现。mapReduce为您提供了对JavaScript的更多控制,但仍然基于该引擎。您没有理由不能改为实现
aggregate
方法。