【问题标题】:How to model a pending trade in MongoDB?如何在 MongoDB 中为待处理的交易建模?
【发布时间】:2016-05-21 22:18:49
【问题描述】:

我想知道“Mongo Way”是什么用于建模两个用户之间的物品待处理交易。

我有一个用户收藏,我有一个图书收藏。在我的应用程序中,用户将能够相互提出交易建议。在交易提案被接受之前,交易需要作为待处理交易存储在数据库中。

在我看来,最好的选择是在每个书籍文档上都有一个“交易”属性,这样建模(使用 Mongoose):

const booksSchema = new Schema({
  title: { type: String, required: true },
  createdAt: { type: Date, 'default': Date.now },
  updatedAt: { type: Date, 'default': Date.now },
  author: { type: String, required: false},
  imageUrl: { type: String, required: false},
  ownerUser: { type: Schema.ObjectId, required: true },
  trades: [{
    fromUser: { type: Schema.ObjectId, required: true },
    bookOffered: { type: Schema.ObjectId, required: true }
  }]
});

我看到的问题是,当交易被接受时,它将涉及更新两个文件。假设交易被接受,则需要更改每个文档上的ownerUser,并且需要清除trades 数组。

似乎要做到这一点,您希望将更改放在某种“事务”中,这样​​如果一个由于某种原因没有更新,那么另一个也不会。

这是模拟这种情况的典型方法吗?如何处理“交易”部分的情况?

【问题讨论】:

  • 那么一本书的每个例子都有它自己的条目?您可能还应该在架构中包含 _id。
  • 我认为这是 Mongoose 自动包含的。
  • MongoDB 本身会在服务器上为你注入一个 _id。

标签: mongodb mongoose


【解决方案1】:

在 MongoDB 中无法进行包含多个文档的事务。 您可以考虑单独的贸易集合,其中包含以下文件:

{
   book: ...,
   ownerUser: ...,
   buyerUser: ...,
   status: 'pending' 
   dateSold: null
}

当交易被批准后,您可以先更改此文件,然后再更新任何相关文件。如果其他事情失败了,这个文件将决定交易是否真的发生了。

【讨论】:

    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 2020-01-23
    相关资源
    最近更新 更多