Mongodb множественный поиск $зависит от первого поиска

#javascript #node.js #mongodb

#язык JavaScript #node.js #mongodb

Вопрос:

Привет, у меня есть схема монго под названием «платежи», в которой есть 2 ключа, которые являются необязательными: идентификатор пользователя или идентификатор представителя (если идентификатор пользователя существует, идентификатор представителя не существует и то же самое о идентификаторе представителя). Когда я нашел схему платежей, основанную на схеме чеков , которая использует $match для фильтрации результата на основе моих данных, я приношу все платежи в первом поиске, которые соответствуют моему запросу, во втором и третьем поиске я хочу привести данные пользователя / репрезентативные данные. Может быть, это будет смесь из них, все в порядке, это то, что я хочу видеть, если одного из них не существует, другой должен существовать.

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

Я использую aggregate для реализации этого.

проблема в том, что он возвращает мне пустой массив, когда отображаются 2 поиска(пользователь и представитель), но когда я комментирую поиск пользователя или представителя, и я оставил 2 поиска для оплаты, и после этого последнего поиска пользователь / представитель и его работа мне нравится, как я хочу, но только для пользователя / представителя, только если я удалю один из поиска. Я хочу, чтобы он привел мой массив с двумя из них.

 const userAndRepData = await ChequeDB.aggregatelt;{[key: string]: any}gt;([  {  $match: {  $and: [  {  'chequeNumber': {  $in: chequeData.map(c =gt; c.chequeNumber)  },  'accountNumber': {  $in: chequeData.map(c =gt; c.accountNumber)  }  }  ]    }  },   {  $lookup: {   from: 'payments',  localField: 'paymentId',  foreignField: '_id',  as: 'payment'  }  },  {  $unwind:'$payment'  },  {  $lookup: {  from: 'representatives',  localField: 'payment.representativeId',  foreignField: '_id',  as: 'representative'  }  },  {  $unwind: '$representative'  },  {  $lookup: {  from: 'users',  localField: 'payment.userId',  foreignField: '_id',  as: 'user'  }  },  {  $unwind: '$user'  },  {  $project: {  user: 1,  _id: 0,  representative: 1  }  }  ]);  

Ответ №1:

К сожалению, вы не можете использовать данные из одного $lookup в следующем, так как данные из $lookup все еще не были загружены в момент выполнения запроса, т. е. payment.representativeId будут равны нулю.

Вы можете писать ресурсоемкие запросы, которые будут обходить это, но самый простой и лучший (с точки зрения производительности) способ выполнения этого запроса — иметь representativeId и userId хранить в Cheque коллекции.

Комментарии:

1. Как я могу это сделать?

2. Если возможно, вам нужно будет сохранить representativeId и userId в вашей Cheque коллекции, чтобы вы могли использовать ее в поиске. Не уверен, как выглядит ваш код, но вам также потребуется обновить методы вставки/обновления чеков, чтобы сохранить эти поля.