MongoDB - как ссылаться на дочерний / вложенный документ _id внутри родительского при вставке - PullRequest
0 голосов
/ 09 мая 2020

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

{
    "_id": ObjectId("messageThreadId"),
    "messages": [
        {
            "_id": ObjectId("messageId"),
            "body": "Lorem ipsum..."
        }, etc...]
    "users": [
        {
            "_id": ObjectId("userId"),
            "unreadMessages": ['messageId', 'messageId', etc...]
        }
    ]
}

Мне нужно использовать pymon go для вставки нового messageThread s, который должен (изначально) содержать одно сообщение. Однако я не понимаю, как построить списки users.unreadMessages из messageId s (которые должны содержать только недавно созданное исходное сообщение). Есть ли способ сослаться на _id исходного сообщения до / в момент его создания из того же документа? Также стоит отметить, что unreadMessages - это список строк, а не ObjectId() s.

Нужно ли мне создавать messageThread с пустым списком unreadMessages, затем go назад и извлекать _id исходного сообщения, которое только что было создано, а затем обновлять каждое unreadMessages в списке пользователей? Мне кажется неправильным требовать несколько транзакций для вставки, но мне кажется неправильным вся эта схема.

1 Ответ

0 голосов
/ 11 мая 2020

Как сказал DaveStSomeWhere, я закончил предварительную генерацию ObjectId, а затем использовал его в документе перед вставкой. Это то, что делает PyMon go, когда он все равно собирается вставить документ: соответствующий код в pymongo.collection.insert_one(). Спасибо, Дэйв.

...