如何构建需要在 mongoDB 上过滤的引用文档?

How to structure a referenced document that needs to be filtered on mongoDB?

我有一个用户文档和一个交易文档。

我需要获取用户交易并按日期范围和付费或非付费等属性对其进行过滤。

由于我的交易模式是无界的,我使用 mongoose 虚拟来为用户填充交易,但正如我所见,不可能对虚拟进行 MongoDb 查询,因为它实际上并不在数据库中.

使用架构:

const userSchema = new mongoose.Schema(
  {
    name: {
      type: String,
      required: true,
    },
    email: {
      type: String,
      required: true,
      trim: true,
      unique: true,
    },
    ...
  },
);

userSchema.virtual('transactions', {
  ref: 'Transaction',
  localField: '_id',
  foreignField: 'owner',
});

交易模式:

const transactionSchema = new Schema({
  amount: {
    type: Number,
    required: true,
  },
  ...
  owner: {
    type: Schema.Types.ObjectId,
    ref: 'User',
    required: true,
  },
});

我觉得我在用这种方式对数据库建模时犯了一些错误。对于这种情况,哪种方法最好?

我认为在这里使用虚拟不是个好主意。您在交易模型中有用户参考就足够了。您可以使用 mongo aggregations 查询您喜欢的任何内容 您可以对交易集合进行聚合并使用 $lookup(如 here 所述)来填充用户或查询他们。