Я рассмотрел time
как ISODate()
Кроме того, lastuptime
предоставленный клиентом будет ISODate()
коллекция :
{
"_id" : ObjectId("5da31a63c35040d7fbf1db3c"),
"chatid" : "133235",
"messages" : [
{
"from" : "user3",
"content" : "Hello",
"time" : ISODate("2016-05-01T00:00:00Z")
},
{
"from" : "user2",
"content" : "Hi",
"time" : ISODate("2018-05-01T00:00:00Z")
}
]
}
{
"_id" : ObjectId("5da31ab2c35040d7fbf1db3d"),
"chatid" : "133235",
"messages" : [
{
"from" : "user2",
"content" : "Hello",
"time" : ISODate("2010-05-01T00:00:00Z")
},
{
"from" : "user12",
"content" : "Hi",
"time" : ISODate("2019-05-01T00:00:00Z")
}
]
}
Есть два сценария. В зависимости от вашего варианта использования выберите соответствующий:
1 . Получить chats
, где любое из сообщений имеет time
>=
lastuptime
db.chatcol.find({'messages.time': {"$gte": ISODate("2017-10-01T00:00:00.000Z")}})
Выход :
{
"_id" : ObjectId("5da31a63c35040d7fbf1db3c"),
"chatid" : "133235",
"messages" : [
{
"from" : "user3",
"content" : "Hello",
"time" : ISODate("2016-05-01T00:00:00Z")
},
{
"from" : "user2",
"content" : "Hi",
"time" : ISODate("2018-05-01T00:00:00Z")
}
]
}
{
"_id" : ObjectId("5da31ab2c35040d7fbf1db3d"),
"chatid" : "133235",
"messages" : [
{
"from" : "user2",
"content" : "Hello",
"time" : ISODate("2010-05-01T00:00:00Z")
},
{
"from" : "user12",
"content" : "Hi",
"time" : ISODate("2019-05-01T00:00:00Z")
}
]
}
2 . Fetch messages
, где time
>=
lastuptime
Это выравнивает message
array
db.chatcol.aggregate([
{ $unwind :'$messages'},
{ $match : {"messages.time": { "$gte": ISODate("2017-10-01T00:00:00.000Z") }}}
])
Выход :
{
"_id" : ObjectId("5da31a63c35040d7fbf1db3c"),
"chatid" : "133235",
"messages" : {
"from" : "user2",
"content" : "Hi",
"time" : ISODate("2018-05-01T00:00:00Z")
}
}
{
"_id" : ObjectId("5da31ab2c35040d7fbf1db3d"),
"chatid" : "133235",
"messages" : {
"from" : "user12",
"content" : "Hi",
"time" : ISODate("2019-05-01T00:00:00Z")
}
}
Примечание : сопоставьте запрос $gte
в соответствии с lastuptime