Mongo查询返回日期范围内的唯一数据

时间:2015-12-02 21:13:16

标签: mongodb

我需要查询我的用户集合,以查找在日期之后开始的新用户" 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();

2 个答案:

答案 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"}}}]);