В настоящее время я пытаюсь достичь чего-то, что было бы тривиально в SQL, но действительно болезненно с Mongoose / MongoDb 3.3.
У меня есть коллекция разговоров. Разговор начинается эмитентом и состоит из нуля или более сообщений. сообщения обмениваются между эмитентом и пользователем и хранятся в массиве сообщений. Моя задача довольно проста, посчитайте количество непрочитанных сообщений для данного эмитента.
Один разговор для одного эмитента может выглядеть следующим образом:
{
"_id" : ObjectId("578caba0264f76ec80d87e7c"),
"issuer" : ObjectId("578c9c68261246f717343ab7"),
"messages" : [
{
"content" : "Hi !",
"type" : "text",
"user" : ObjectId("56582b17b380912011c485e2"),
"_id" : ObjectId("578caba08cf9a9081927e326"),
"createdAt" : ISODate("2016-07-18T10:12:48.778Z"),
"seenAt" : ISODate("2016-07-18T10:13:16.725Z")
},
{
"content" : "Wassup ?",
"type" : "text",
"user" : ObjectId("569a9d343bd9840e26797412"),
"_id" : ObjectId("578cabcb8cf9a9081927e327"),
"createdAt" : ISODate("2016-07-18T10:13:31.254Z"),
"seenAt" : ISODate("2016-07-18T10:13:34.133Z")
},
{
"content" : "Fine, ya ?",
"type" : "text",
"user" : ObjectId("569a9d343bd9840e26797412"),
"_id" : ObjectId("578cabd38cf9a9081927e328"),
"createdAt" : ISODate("2016-07-18T10:13:39.573Z")
}
}
}
Я до сих пор пробовал использовать агрегацию Mongoose:
function findUnreadByIssuerId(issuerId) {
return Conversation
.aggregate()
.match({ issuer: issuerId })
.unwind('messages')
.match({'messages.seenAt' : { $exists: 'false'} })
.count()
.exec();
}
Дело в том, что nodejs жалуется на то, что count () не является функцией. Похоже, что с агрегатами все в порядке, так как, если я уберу count (), я получу массив.
Затем я попытался использовать $ group, но я новичок в Mongo и его группировке и получаю пустой массив:
return Conversation .aggregate([
{ $match: { issuer: issuerId } },
{ $unwind: '$messages' },
{ $match: {'messages.seenAt' : { $exists: 'false'} } },
{ $group: {
_id: '$messages.createdAt',
count: { $sum: 1 }
}}
])
.exec();
В приведенном примере ожидаемый результат вызова будет в идеале 2. Но я могу справиться с {sum: 2}, хотя и не идеально. Что не так с моей цепочкой агрегатов Mongoose?