Запрос к массиву во вложенном документе с помощью pymongodb - PullRequest
0 голосов
/ 13 октября 2019

Я создаю программу чата. В бэкэнде у меня есть


chatcol.insert({ "chatid": "133235", "messages": [ {"from": "user3", "content": "Hello", "time": "20101213T172215"},  {"from": "user2", "content": "Hi", "time": "20101214T172215"} ] })

chatcol.insert({ "chatid": "134735", "messages": [ {"from": "user2", "content": "Hello", "time": "20101217T172215"},  {"from": "user12", "content": "Hi", "time": "20101213T172215"} ] })

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

Как мне написать такой запрос?

1 Ответ

0 голосов
/ 13 октября 2019

Я рассмотрел 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

...