我在 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。