Монго групповая дата внутри массива - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть коллекция в моей базе данных as,

[
    {
        "groupName" : "testName",
        "participants" : [
            {
                "participantEmail" : "test@test.com",
                "lastClearedDate" : 12223213123
            },
             {
                "participantEmail" : "test2@test.com",
                "lastClearedDate" : 1234343243423
            }
        ],
        "messages" : [
            {
                "message":"sdasdasdasdasdasd",
                "time":22312312312,
                "sender":"test@test.com"
            },
            {
                "message":"gfdfvd dssdfdsfs",
                "time":2231231237789,
                "sender":"test@test.com"
            }
        ]
    }
]

Это коллекция группы, которая содержит всех участников и сообщения в этой группе.Поле времени внутри сообщения - это отметка времени.

Я хочу получить все сообщения внутри группы, которые публикуются после указанной даты и группируются по дате.Я написал следующий код,

      ChatGroup.aggregate([
        { $match: { group_name: groupName } },
        { $unwind: "$messages" },
        { $match: { "messages.time": { $gte: messagesFrom } } },
        {
          $project: {
            _id: 0,
            y: {
              $year: {
                $add: [new Date(0), { $multiply: [1000, "$messages.time"] }]
              }
            },
            m: {
              $month: {
                $add: [new Date(0), { $multiply: [1000, "$messages.time"] }]
              }
            },
            d: {
              $dayOfMonth: {
                $add: [new Date(0), { $multiply: [1000, "$messages.time"] }]
              }
            }
          }
        },
        {
          $group: {
            _id: {
              year: "$y",
              month: "$m",
              day: "$d"
            },
            messages: { $push: "$messages" },
            count: { $sum: 1 }
          }
        }
      ]).then(
        group => {
          console.log("length of messages", group);
          resolve(group);
        },
        err => {
          console.log(err);
        }
      );
    });

, и получаю следующий вывод:

[
    {
        "_id": {
            "year": 50694,
            "month": 9,
            "day": 5
        },
        "messages": [],
        "count": 3
    },
    {
        "_id": {
            "year": 50694,
            "month": 8,
            "day": 27
        },
        "messages": [],
        "count": 1
    },
    {
        "_id": {
            "year": 50694,
            "month": 8,
            "day": 26
        },
        "messages": [],
        "count": 10
    }
]

Я не получаю сообщения, но счет правильный.Кроме того, время, которое отображается в результате, является неправильным, например, год, дата и месяц.Версия Mongo - 3.2.

Я передал групповую информацию и отправил документацию из mongodb вместе с другими вопросами по stackoverflow по группе mongo:

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Ваша временная метка уже в секундах.Таким образом, вам не нужно преобразовывать их в миллисекунды путем умножения на 1000.

Таким образом, ваш последний запрос должен выглядеть примерно так:

ChatGroup.aggregate([
  { "$match": {
    "group_name": groupName,
    "messages.time": { "$gte": messagesFrom }
  }},
  { "$unwind": "$messages" },
  { "$match": { "messages.time": { "$gte": messagesFrom }}},
  { "$group": {
    "_id": {
      "year": { "$year": { "$add": [new Date(0), "$messages.time"] }},
      "month": { "$month": { "$add": [new Date(0), "$messages.time"] }},
      "day": { "$dayOfMonth": { "$add": [new Date(0), "$messages.time"] }}
    },
    "messages": { "$push": "$messages" },
    "count": { "$sum": 1 }
  }}
])
0 голосов
/ 26 сентября 2018

Добавить messages в $project

{
          $project: {
            _id: 0,
            messages : 1,
           .........
        },
}
...