2012-03-11 1 views
0

Итак, моя операция уменьшения карты суммирует список микро платежей в единовременную сумму, которую я должен определенному пользователю. User_id заканчивается как _id. Я также сохраняю идентификаторы массива микро платежей, которые необходимо оплатить. Выход идет в коллекцию проницаемости, называемую платежами.Должен ли я получать доступ к карте Уменьшить объем вывода в виде Монгоидного документа?

Выход выглядит следующим образом для одного документа

{ "_id" : ObjectId("4f48855606164f4765000004"), "value" : { "payment" : "5.0", "conversions" : [ ObjectId("4f5bd23baa113e964700000e") ] } } 

я вроде как отслеживать эти платежи, так что я думал о том, просто здании Mongoid документа вокруг сбора платежей. Я знаю, что это можно сделать, но я не видел, чтобы кто-то это делал, поэтому мне кажется, что должен быть лучший способ.

Также одна проблема с этим подходом заключается в том, что я делаю платежи каждый месяц, так что _id будет user_id конфликтует. Кроме того, я думаю, что есть возможная проблема с транзакциями, потому что мне нужно обновить микро-платежи в другое состояние, чтобы я знал, что они больше не будут платить им, и что произойдет, если один из платежей не удастся? Это изменение состояния происходит через state_machine, если это имеет значение.

ответ

0

Должен ли я получать доступ к карте Уменьшить объем производства в качестве монгольского документа?

Несомненно, вы можете это сделать. Вот почему M/R выводится в коллекцию, а не просто «некоторый файл».

Также одна проблема с этим подходом заключается в том, что я делаю платежи каждый месяц, поэтому _id является user_id конфликтующим.

Так ясно, что вывод вашего M/R - важные данные. Не оставляйте эти данные в коллекции, которая может быть «забита» будущим M/R. Вместо этого переименуйте созданную коллекцию или запустите цикл for, который вручную добавляет данные в коллекцию «хранитель».

В коллекции «хранитель» измените _id на что-то вроде _id: { uid: ObjectId('...'), month: "201203" }. Вы также можете «развернуть» поле values в несколько полей. И вам нужно будет добавить поле для идентификатора транзакции.

Также помните, что MongoDB использует «огонь & забыть» пишет по умолчанию. Это низкая безопасность. У вас есть финансовые данные, поэтому убедитесь, что вы следуете все лучшие практики для доступности и данных безопасности:

  • журналирования
  • Replica Sets (с центром вторичных данных)
  • Убедитесь, что все записи в этом collection/db сделаны с w: majority и journal: true. Это замедлит пропускную способность БД при этой операции, так как эти записи могут занять несколько сотен миллисекунд.
  • База паролей
  • Нестандартные MongoDB порта, IP-белый список (обычная безопасность DB)

что произойдет, если один из платежей не удастся?

Это нетривиальная проблема и слишком сложная для объяснения здесь. Вместо этого см. Этот документ на странице two-phase commit with MongoDB.

Обратите внимание, что для двухфазной фиксации требуется команда MongoDB findAndModify. Вам нужно будет научиться справляться с этим с помощью Mongoid.