Many to many update in MongoDB without transactions

前端 未结 3 978
死守一世寂寞
死守一世寂寞 2021-02-14 20:08

I have two collections with a many-to-many relationship. I want to store an array of linked ObjectIds in both documents so that I can take Document A and retrieve all linked Doc

3条回答
  •  没有蜡笔的小新
    2021-02-14 20:46

    @Gareth, you have multiple legitimate ways to do this. So they key concern is how you plan to query for the data, (i.e.: what queries need to be fast)

    Here are a couple of methods.

    Method #1: the "links" collection

    You could build a collection that simply contains mappings between the collections.

    Pros:

    • Supports atomic updates so that data is not lost

    Cons:

    • Extra query when trying to move between collections

    Method #2: store copies of smaller mappings in larger collection

    For example: you have millions of Products, but only a hundred Categories. Then you would store the Categories as an array inside each Product.

    Pros:

    • Smallest footprint
    • Only need one update

    Cons:

    • Extra query if you go the "wrong way"

    Method #3: store copies of all mappings in both collections

    (what you're suggesting)

    Pros:

    • Single query access to move between either collection

    Cons:

    • Potentially large indexes
    • Needs transactions (?)

    Let's talk about "needs transactions". There are several ways to do transactions and it really depends on what type of safety you require.

    Should I use safe mode and manually check the data went in afterwards and try again on failure?

    You can definitely do this. You'll have to ask yourself, what's the worst that happens if only one of the saves fails?

    Method #4: queue the change

    I don't know if you've ever worked with queues, but if you have some leeway you can build a simple queue and have different jobs that update their respective collections.

    This is a much more advanced solution. I would tend to go with #2 or #3.

提交回复
热议问题