Применение условия к локальному полю в совокупности в mongodb

#mongodb #mongoose #aggregation-framework

#mongodb #мангуст #структура агрегации

Вопрос:

У меня есть две коллекции user и transaction , транзакция имеет два поля customer и seller , а пользователь имеет два поля name и email ., коллекция пользователей содержит данные клиентов и продавцов

Я хочу выводить так, как если email бы переданное принадлежало customer , тогда seller детали должны поступать из поиска, а если email переданное принадлежит seller , то customer детали должны поступать из поиска

Что я сделал, так это то, что я передаю значение email динамически, email значение может принадлежать customer или seller , если email совпадает seller , тогда я хочу localfield , чтобы поиск в качестве customer и наоборот. Вот что я пробовал.

 const email = req.email;

transaction.aggregate([{
    $match: {
      $or: [{
          customer: email,
        },
        {
          seller: email,
        },
      ],
    },
  },
  {
    $lookup: {
      from: "user",
      localField: {
        $cond: [{
          if: {
            $eq: ["$customer", email]
          },
          then: "seller",
          else: "customer",
        }],
      },
      foreignField: "email",
      as: "user",
    },
  },
  {
    $unwind: "$user"
  },
]);
  

Но для приведенного выше запроса ошибка выглядит следующим образом

 $lookup argument 'localField' must be a string
  

Я использую nodejs, express и mongoose.

Ответ №1:

localField Разрешает только строку, вы можете использовать поиск с конвейером,

  • let чтобы определить логику ваших условий
  • pipeline чтобы поместить ваше условие соответствия в поле коллекции поиска
 {
    $lookup: {
        from: "user",
        let: {
            localField: {
                $cond: [{
                    if: { $eq: ["$customer", email] },
                    then: "$seller",
                    else: "$customer",
                }]
            }
        },
        pipeline: [
            { $match: { $expr: { $eq: ["$email", "$$localField"] } } }
        ],
        as: "user"
    }
}
  

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

1. $cond значением в этом случае должен быть просто объект из массива

2. @SemyonVyskubov не совсем понял вас.