2015-12-04 3 views
1

Я следующие документы в коллекции MongoDB в:MongoDB: Число различных элементов массива

{ 
    "userid" : 1, 
    "open" : [ 
     { 
      "messageid" : 1441, 
      "viewed" : ISODate("2015-03-24T00:50:00Z"), 
     }, 
     { 
      "messageid" : 1441, 
      "viewed" : ISODate("2015-06-21T00:10:00Z"), 
     }, 
     { 
      "messageid" : 1527, 
      "viewed" : ISODate("2015-06-21T07:52:00Z"), 
     } 
    ] 
} 
{ 
    "userid" : 2, 
    "open" : [ 
     { 
      "messageid" : 2155, 
      "viewed" : ISODate("2015-09-15T15:32:00Z"), 
     }, 
     { 
      "messageid" : 2208, 
      "viewed" : ISODate("2015-10-02T12:20:00Z"), 
     }, 
     { 
      "messageid" : 2263, 
      "viewed" : ISODate("2015-01-15T07:50:00Z"), 
     } 
    ] 
} 

Я хочу пользователей, просмотревших 3 или более различных сообщений в определенный период времени.

Пример запроса:

Дайте пользователям те, кто рассматривают 3 или более различных сообщений между 2015-01-01 до 2015-11-30

Ожидаемый результат: {userid: 2}

Примечание: (userid: 1) также просмотрел 3 сообщения в определенном диапазоне дат, но они не являются отдельными сообщениями.

Пожалуйста, помогите мне построить запрос выбора MongoDB.

+0

Я попытался с помощью следующей агрегации запроса, но это заняло так много времени, как у меня есть около 5 миллионов записей в моей коллекции. db.userDetails.aggregate ({$ match: {userid: {$ in: [225144,3]}}}, {$ unwind: "$ open"}, {$ match: {"open.viewed": {$ gte: 15010100, $ lte: 15063048}}}, {$ group: {_id: "$ userid", открыть: {$ addToSet: "$ open"}}}, {$ out: "segment"}) –

ответ

3

Вы можете использовать агрегацию, такие как

db.userDetails.aggregate([ 
    { $unwind: "$open" }, 
    { $match: { 
     "open.viewed": { $gte: ISODate(new Date("2015-01-01").toISOString()), $lte: ISODate(new Date("2015-11-30").toISOString()) 
     } 
    }}, 
    { $group: { 
     _id: "$userid", 
     open_messageids: { $addToSet: "$open.messageid" } 
    }}, 
    { $unwind: "$open_messageids" }, 
    { $group: { 
     _id: null, 
     count: { $sum: 1 } 
    }}, 
    { $match: { count : { $gte : 3 } } } 
]) 
+0

Я изменил свои даты на целые числа. i.e. '2015-11-30 12:00:00' => 15113012 Я использовал следующий запрос сейчас, и он по-прежнему дает мне пустой результат. db.userDetails.aggregate ([{$ unwind: "$ open"}, {$ match: {"open.viewed": {$ gte: 15010100, $ lte: 15123048}}}, {$ group: {_id : "$ userid", open_messageids: {$ addToSet: "$ open.messageid"}}}, {$ unwind: "$ open_messageids"}, {$ group: {_id: "$ userid", count: {$ sum: 1}}}, {$ match: {count: {$ gte: 3}}}, {$ out: "segment"}]) –

+0

, пожалуйста, проверьте 'view' тип даты – skmahawar

+0

Извините, я пропустил что-то, got is {"_id": null, "count": 118314} Мне нужны записи с идентификатором пользователя. –

Смежные вопросы