икремент/декремент баланса при помощи транзакций
появилась необходимость - анализировать баланс
ok, добавили коллекцию "транзакции" (debit/credit, sum, desctiption, etc.)
т.е. при покупки чего-либо со стороны пользователи выполняются действия:
- списываем сумму { $inc: { balance: -N } }
- создаем запись в коллекции транзакции
- коммит
вроде все нормально и работает
бухгалтерия получает отчетность в виде:
- пополнение
- списание
- и т.д.
вопрос №1
нормальный подход при работе с балансом и коллекцией транзакции?
вопрос №2
как быть, если необходимо теперь связать транзакции с покупками?
бухгалтерия кроме текста "списание -100" хочет видеть что купил пользователь
а кроме текста "пополнение +200" хочет видеть как пополнил пользователь
тема обширная, подскажите идеи/статьи куда копать чтобы все связать с транзакциями
1. нормально, кроме транзакций конечно можно перестроить все на идемпотентность, но это сложно будет 2. начать с определений что такое покупка, пополнение, где и как они фиксируются. Потом собрать список того что хотят видеть в результате по этим данным. Выбрать самую подходящую схему связывания (просто в виде ссылки, хранение внутри транзакции или вообще в стороннем хранилище уже предагрегированные данные)
> 1. нормально, кроме транзакций конечно можно перестроить все на идемпотентность, но это сложно будет здесь не совсем понял "перестроить все на идемпотентность" о чем примерно может идти речь? попробую нагуглить, но от помощи не откажусь (статья или любое другое объяснение) > 2. начать с определений что такое покупка, пополнение, где и как они фиксируются. Потом собрать список того что хотят видеть в результате по этим данным. Выбрать самую подходящую схему связывания (просто в виде ссылки, хранение внутри транзакции или вообще в стороннем хранилище уже предагрегированные данные) примерно начал прикидывать, но кажется таким уродским решением есть транзакция (user, debit/credit, amount, description, createdAt, etc.) есть действие транзакции (transactionId, type: "deposit", "buyGame", "buyElectronic", depositId, gameId, electronicId, etc.) т.е. действие транзакции включает все возможные ID: - depositId - gameId - electronicId но только 1 id может быть указан выглядит стремно, все перерыл, не придумал ничего иного цель - бухгалтерия должна увидеть по транзакциям: - списание -100 (купил игру #gameId, вот описание) - пополнение +200 (пополнил #depositId, вот описание)
спасибо что помогаете и подсказываете!
1. особо под рукой ничего нет, поэтому просто почитайте про идемпотентность, думаю пару статеек дадут понимание, а дальше только прикидывать как у себя можно это применить 2. так нормально выглядит, по id можно при необходимости подтянуть данные например по связанной игре. не совсем понятно хотите ли вы хранить транзакии и экшн в разных коллекциях, если да то в этом нет необходимости и можно просто сделать поле transactionAction:{type:.. , gameId:. ...} . Выборки в таком случае будут так же удобны как и в отдельной коллекции, но не придется собирать из разных коллекций данные
> 1. особо под рукой ничего нет, поэтому просто почитайте про идемпотентность, думаю пару статеек дадут понимание, а дальше только прикидывать как у себя можно это применить понял, спасибо! 2. так нормально выглядит, по id можно при необходимости подтянуть данные например по связанной игре. не совсем понятно хотите ли вы хранить транзакии и экшн в разных коллекциях, если да то в этом нет необходимости и можно просто сделать поле transactionAction:{type:.. , gameId:. ...} . Выборки в таком случае будут так же удобны как и в отдельной коллекции, но не придется собирать из разных коллекций данные думаю что так сделаю collection transaction: - userId (ref) - type: String (debit/credit) - amount: Int - description: String - actions: { depositId (ref) gameId (ref) electronicId (ref) } да и не надо будет отдельно коллекцию тащить с экшенами + лукап побыстрее будет (избавляемся от доп. единицы)
только бы actionS без S, а то будет желание как с массивом работать. А при появлении массива уже начнутся трудности при которых уже можно рассматривать связанную табличку)
ага, ошибочка уберу "s"
а вот сразу интересно здесь какой-нибудь dynamic lookup возможен? или с учетом того, что у меня есть некая гарантия, что в action будет только 1 id, то можно сделать так: { '$lookup': { 'from': 'games', 'localField': 'gameId', 'foreignField': '_id', 'as': 'dataGame' }, { '$lookup': { 'from': 'deposits', 'localField': 'depositId', 'foreignField': '_id', 'as': 'dataDeposit' }, { '$lookup': { 'from': 'electronics', 'localField': 'electronic', 'foreignField': '_id', 'as': 'dataElectronic' } а так уже кодом
хах, ровно этот же вопрос первый вылез когда начал писать ответ, но все реашется банально таким лукапом как раз изза того что если idне выставлен, то ничего не замапится и поулчится заполненным только то что есть. Так что пока у вас там не массив то это действительно будет работать
Обсуждают сегодня