Как я могу получить объект через свойство ссылочного объекта в mongoose - PullRequest
0 голосов
/ 01 марта 2020

У меня есть объект wallet со ссылочным свойством Company.

  const walletSchema = new Schema(
  {
    type: {
      type: mongoose.Schema.Types.ObjectId,
      required: true,
      ref: 'WalletType'
    },
    owner: {
      type: mongoose.Schema.Types.ObjectId,
      required: true,
      ref: 'Company'
    },      {
    timestamps: { createdAt: 'created_at', updatedAt: 'last_updated' }
  }
);



 const companySchema = new Schema({
  name: {
    type: String,
    maxlength: 50,
    required: true
  },
  staff_size: {
    type: Number,
  }

)

Я пытаюсь получить кошелек с определенным названием компании. Это мой запрос ниже, но, похоже, он не работает.

await this.find({owner: { name : { $regex: term, $options: 'i' }}})
         .populate(
           {
             path: 'type',
             select: '_id name'
           },
           {
             path: 'owner',
             select: 'name'
           }
         )
        .sort({ last_updated: -1 })
        .exec();

Я получаю ошибку CastError: Cast to ObjectId failed for value "{ name: { '$regex': 'Gambeat', '$options': 'i' } }" at path "owner" for model "Wallet"

1 Ответ

1 голос
/ 02 марта 2020

Ниже не будет работать, потому что запрос выполняется в первую очередь перед заполнением. На момент запроса модели имя владельца не было заполнено в то время.

await this.find({owner: { name : { $regex: term, $options: 'i' }}})
         .populate(
           {
             path: 'type',
             select: '_id name'
           },
           {
             path: 'owner',
             select: 'name'
           }
         )
        .sort({ last_updated: -1 })
        .exec();

Что вы можете сделать, это то, что при заполнении владельца вы заполняете владельца только с указанным именем. Это должно работать:

let wallets = await this.find({}).populate(
               {
                 path: 'type',
                 select: '_id name'
               },
               {
                 path: 'owner',
                 match: {name: { $regex: term, $options: 'i' }},
                 select: 'name _id'
               }
             )
            .sort({ last_updated: -1 })
            .exec();

Это все еще возвращает все кошельки, но будет иметь какое-то поле компании пустым. так что вы можете фильтровать, чтобы получить только те, с компанией, не нуль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...