Как структурировать ссылочный документ, который нужно отфильтровать на mongoDB? - PullRequest
0 голосов
/ 16 июня 2020

У меня есть документ пользователя и документ транзакции.

  • У транзакции есть владелец (пользователь),
  • У пользователя есть набор транзакций, размер которых не ограничен .

Мне нужно получить пользовательские транзакции и отфильтровать их по некоторым свойствам, таким как диапазон дат и платный или неоплаченный.

Поскольку моя схема транзакций не ограничена, я использовал mon goose виртуальных машин для заполнения Пользователя транзакциями, но, как я вижу, невозможно выполнять запросы 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,
  },
});

Мне кажется, что я допустил ошибку при моделировании базы данных таким образом. Как лучше всего подходить к этому случаю?

1 Ответ

0 голосов
/ 16 июня 2020

Я не думаю, что использовать здесь виртуалы - хорошая идея. У вас есть ссылка на пользователя в вашей модели транзакции, и этого достаточно. Вы можете запрашивать все, что захотите, с помощью mon go aggregations . Вы можете выполнить агрегирование при сборе транзакций и использовать $lookup (как описано здесь ) для заполнения пользователей или запроса их.

...