получить последний документ после $ group by - PullRequest
0 голосов
/ 27 мая 2018

Я использую официальный драйвер MongoDB для Node.js.

И вот как структурируются данные моего сообщения.Как видите, у каждого сообщения есть метка времени, идентификатор пользователя и идентификатор темы.

[
  {
    "_id" : ObjectId("5b0abb48b20c1b4b92365145"),
    "topicId" : "XN7iqmCFD4jpgJZ6f",
    "timestamp" : 1527429960,
    "user" : "5b0869636f4e363e300d105a",
    "content" : "lorem ipsum"
  }    
]

Теперь мне нужно проверить, есть ли темы, которых нет в последнем сообщении (= самая высокая метка времени)соответствовать моему собственному идентификатору.После этого я знаю, на какую тему есть новый ответ (это не мой собственный пост).

Итак, я начал с этого:

db.messages.find({
  $query: { 
    user: { $ne: "myUserId" }
  },
  $orderby: { 
   timestamp: -1 
  }
}).limit(1).toArray()

Моя проблема в том, что я не знаюкак сгруппировать мой запрос по topicId.И почему-то, похоже, в моей попытке неправильный синтаксис.

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Вы должны использовать агрегат для группировки по topicId, а затем $sort для сортировки по времени, а затем $limit, чтобы ограничить запрос

db.messages.aggregate([
    { $match: { user: { $ne: "myUserId" } }},
    { $group: {
        _id: "$topicId",
        timestamp: { $first: "$timestamp"},
        user: { $first: "$user" },
        content: { $first: "$content" }
    }},
    { $sort: { timestamp: -1 } },
    { $limit: 1 }
])
0 голосов
/ 27 мая 2018

Используйте агрегатный конвейер, чтобы сделать это вместо поиска.

1) $ match $ ne: "myUserId"

2) $ sort timestamp: -1

3) $ group topicId $ first

Пример запроса, который я написал в прошлом ..

{ "$match": { $and: [ {'latestTimeStamp': { "$gte": new Date('3/11/2018') }}, {'latestTimeStamp': { "$lte": new Date('4/12/2018') }} ]}  },


                            { $unwind: '$latestSev'},


                            { $sort: {'latestSev.sevRating': -1}},


                            { $group:{  _id:{_id:'$_id', latestTimeStamp:'$latestTimeStamp', latestLikeli:'$latestLikeli', latestControl:'$latestControl', residualRatingArray:'$residualRatingArray'}, 


                                        latestMaxImpName: {$first:'$latestSev.impName'} ,

                                        latestMaxSevRating: {$first:'$latestSev.sevRating'}
                                    }

                            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...