0

我在 MongoDB 的用户集合中有以下数据:

{
        "_id" : ObjectId("53807beee4b0d2b25747df7e"),
        "allowedAppIds" : [ 
            {
                "appId" : "534c8d2ce4b024b1f08e16e6",
                "createdDate" : ISODate("2014-06-21T20:22:11.945Z"),
            }, 
            {
                "appId" : "53585d97e4b0769f79d1e140",
                "createdDate" : ISODate("2014-06-21T21:03:56.045Z"),
            }, 
            {
                "appId" : "53490f2ae4b024b1f08e0c39",
                "createdDate" : ISODate("2014-06-26T22:36:21.855Z"),
            }, 
            {
                "appId" : "537e3ad7e4b0a8e6dd5cf20b",
                "createdDate" : ISODate("2014-06-28T19:44:43.805Z"),
            }
        ],
        "createdDate" : ISODate("2014-05-24T11:01:02.835Z"),
    }, 
    {
        "_id" : ObjectId("53aca073e4b00bff4ee85f6d"),
        "allowedAppIds" : [ 
            {
                "appId" : "536927eee4b005b056353a8a",
                "createdDate" : ISODate("2014-06-26T22:36:57.681Z"),
            }
        ],
        "createdDate" : ISODate("2014-06-26T22:36:35.767Z"),
    }, 
    {
        "_id" : ObjectId("53aca12fe4b00bff4ee85fd8"),
        "allowedAppIds" : [ 
            {
                "appId" : "537e3ad7e4b0a8e6dd5cf20b",
                "createdDate" : ISODate("2014-06-27T06:33:32.728Z"),
            }
        ],
        "createdDate" : ISODate("2014-06-26T22:39:43.726Z"),
    }, 
    {
        "_id" : ObjectId("53ac9f86e4b078bf3022fe16"),
        "allowedAppIds" : [ 
            {
                "appId" : "537e3ad7e4b0a8e6dd5cf20b",
                "createdDate" : ISODate("2014-06-26T22:32:49.655Z"),
            }, 
            {
                "appId" : "534c8d2ce4b024b1f08e16e6",
                "createdDate" : ISODate("2014-06-26T22:42:38.011Z"),
            }
        ],
        "createdDate" : ISODate("2014-06-26T22:32:38.806Z"),
    } 

我正在尝试计算整个集合的第一个 appId。因此,对于每个用户,我需要获取他们的第一个 allowedAppId,即该 appId 的组,并获取整个集合的计数。

对于上面的数据,我试图得到这个:

appId:  534c8d2ce4b024b1f08e16e6 count: 1
appId:  536927eee4b005b056353a8a count: 1
appId:  537e3ad7e4b0a8e6dd5cf20b count: 2

一旦我开始工作,我将尝试将日期参数放在 allowedAppIds.createdDate 中的创建日期周围,以进一步按日期过滤。

我对 Mongo 还是很陌生,所以如果这是基本的,我很抱歉。我在 google 等上看到了很多示例,但找不到任何可以使用聚合管道从子文档中获得前 1 条记录的东西。

通过在我的管道中执行此操作,我确实获得了对实际具有 allowedAppIds 的记录的过滤(并非所有用户文档都有 allowedAppId 子文档):

db.user.aggregate({$match:{"allowedAppIds.0": {$exists: true}}})

但我仍然无法从那里获取第一个与 createdDate 相关联的 appId。

4

1 回答 1

0

您可以通过展开allowedAppIds字段然后分组两次来做到这一点:

db.test.aggregate([
    // Duplicate the docs, one per allowedAppIds element
    {$unwind: '$allowedAppIds'},
    // Group them back by _id, but just take the first element from each _id set
    {$group: {_id: '$_id', appId: {$first: '$allowedAppIds.appId'}}},
    // Now group by appId and count
    {$group: {_id: '$appId', count: {$sum: 1}}}
])

输出:

{
    "result" : [ 
        {
            "_id" : "534c8d2ce4b024b1f08e16e6",
            "count" : 1
        }, 
        {
            "_id" : "536927eee4b005b056353a8a",
            "count" : 1
        }, 
        {
            "_id" : "537e3ad7e4b0a8e6dd5cf20b",
            "count" : 2
        }
    ],
    "ok" : 1
}
于 2014-07-15T22:46:45.887 回答