2015-12-02 91 views
0

我需要查询我的用户集合中的新用户,该用户集合在日期“2015-11-20”之后开始,仅返回唯一的电子邮件。在日期范围内返回唯一数据的Mongo查询

这里的结构的一个示例:

{ 
    "_id" : ObjectId("abcd123"), 
     "user_name" : "My Name", 
     "last_name" : "Name", 
     "first_name" : "My", 
     "email" : "[email protected]", 
     "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(); 

回答

1

代替聚合,您可以使用distinct收集方法。所以从上面的例子你不同的查询将如下所示:

db.users.distinct('email', {"joining_date": {$gt: ISODate("2015-11-20")}} 

上述查询返回基于条件的电子邮件的数组。

当您按电子邮件,用户名,名字和姓氏进行分组时,您的聚合查询不会返回唯一的电子邮件。这将返回它们的独特组合。如果您只是通过电子邮件分组,那么您将获得唯一的邮件ID。但是,然后所有的邮件ID将在单独的文档中,并且您需要迭代结果集。有一个类似于上面显示的不同方法的类似聚合查询。

db.users.aggregate([ 
    {$match: {"joining_date": {$gt: ISODate("2015-11-20")}}}, 
    {$group: {_id:null, emailIds: {$addToSet : "$email"}}} 
]) 
1

db.collectionName.aggregate([ {$组:{_ ID: “$ distinctcolumnname”,计数:{$总和:1}}}, {$匹配:{ “datecolumnname”:{$ gte:“21-08-2016 00:00:00”,$ lte:“21-08-2016 09:59:59”}}}]);

+0

使用正确的代码格式。 –