我需要查询我的用户集合,以查找在日期之后开始的新用户" 2015-11-20"只返回唯一的电子邮件。
这是一个结构样本:
{
"_id" : ObjectId("abcd123"),
"user_name" : "My Name",
"last_name" : "Name",
"first_name" : "My",
"email" : "my.name@gmail.com",
"user_type" : "general",
"joining_date" : ISODate("2015-11-20T14:56:57.165Z")
}
到目前为止,这是我的查询,我不确定它是如何确保的,即使只返回唯一的电子邮件。
db.users.aggregate([{$match: {"joining_date": {$gt: ISODate("2015-11-20")}}},{$group: {_id:{email: "$email", "first_name": "$first_name", "last_name": "$last_name", "user_name": "$user_name"}}}]).pretty();
答案 0 :(得分:2)
您可以使用distinct
收集方法代替聚合。因此,从上面的示例中,您的独特查询将如下所示:
db.users.distinct('email', {"joining_date": {$gt: ISODate("2015-11-20")}}
上述查询根据条件返回一个电子邮件数组。
当您通过email,user_name,first_name和last_name进行分组时,您的聚合查询将不会返回唯一的电子邮件。这将返回它们的独特组合。如果您只是通过电子邮件进行分组,那么您将获得唯一的邮件ID。但是,所有邮件ID都将在单独的文档中,您需要迭代结果集。有一个类似于上面显示的不同方法的聚合查询。
db.users.aggregate([
{$match: {"joining_date": {$gt: ISODate("2015-11-20")}}},
{$group: {_id:null, emailIds: {$addToSet : "$email"}}}
])
答案 1 :(得分:1)
db.collectionName.aggregate([ {$ group:{_ id:" $ distinctcolumnname",count:{$ sum:1}}}, {$ match:{" datecolumnname":{$ gte:" 21-08-2016 00:00:00" ,$ lte:" 21-08-2016 09:59:59"}}}]);