14

我可以使用“$”运算符引用 MongoDB 聚合管道中属性的各个值的值。但是,我如何访问(参考)整个文档?


更新:提供一个示例来解释场景。

这是我正在尝试做的一个例子。我有一系列推文。每条推文都有一个成员“集群”,这表明特定推文属于哪个集群。

{
    "_id" : "5803519429097792069",
    "text" : "The following vehicles/owners have been prosecuted by issuing notice on the basis of photographs on dated... http://t.co/iic1Nn85W5",
    "oldestts" : "2013-02-28 16:11:32.0",
    "firstTweetTime" : "4 hours ",
    "id" : "307161122191065089",
    "isLoc" : true,
    "powertweet" : true,
    "city" : "new+delhi",
    "latestts" : "2013-02-28 16:35:05.0",
    "no" : 0,
    "ts" : 1362081807.9693,
    "clusters" : [
        {
            "participationCoeff" : 1,
            "clusterID" : "5803519429097792069"
        }
    ],
    "username" : "dtptraffic",
    "verbSet" : [
        "date",
        "follow",
        "prosecute",
        "have",
        "be"
    ],
    "timestamp" : "4 hours ",
    "entitySet" : [ ],
    "subCats" : {
        "Generic" : [ ]
    },
    "lang" : "en",
    "fns" : 18.35967,
    "url" : "url|109|131|http://fb.me/2CeaI7Vtr",
    "cat" : [
        "Generic"
    ],
    "order" : 7
} 

由于我的收藏中有几十万条推文,我想按“clusters.clusterID”对所有推文进行分组。基本上,我想编写如下查询:

db.tweets.aggregate (
{ $group : { _id : '$clusters.clusterID', 'members' : {$addToSet : <????> } } }
)

我想访问当前正在处理的文档并在上面查询中引用它。有谁知道该怎么做?

4

3 回答 3

22

使用$$ROOT变量:

引用当前在聚合管道阶段处理的根文档,即顶级文档。

于 2015-02-18T11:00:23.643 回答
2

目前在聚合框架中没有访问完整文档的机制,如果您只需要字段的子集,您可以这样做:

db.tweets.aggregate([ {$group: { _id: '$clusters.clusterID',
                                  members: {$addToSet :  
                                       { user: "$user",
                                         text: "$text", // etc for subset 
                                                        // of fields you want
                                       }
                                  } 
                               } 
                       } ] )

不要忘记,如果有几十万条推文,聚合整个文档将使您进入返回聚合框架结果文档的 16MB 限制。

您可以通过 MapReduce 执行此操作,如下所示:

var m = function() {
  emit(this.clusters.clustersID, {members:[this]});
}

var r = function(k,v) {
  res = {members: [ ] };
  v.forEach( function (val) {
     res.members = val.members.concat(res.members);
  } );
  return res;
}

db.tweets.mapReduce(m, r, {out:"output"});
于 2013-03-01T13:46:24.233 回答
-1

我认为 MapReduce 对这项任务更有用。

正如 Asya Kamsky 在评论中所写,我的示例对于 mongodb 是不正确的,请使用mongoDB 的官方文档

于 2013-02-28T20:42:10.780 回答