Mongodb сравнить два поля с совокупностью значений совпавших полей - PullRequest
0 голосов
/ 01 января 2019

У меня проблемы в моем запросе, параметр, который я передаю: voucherId и userId, мне нужно проверить, превысил ли этот пользователь ограничениеQuantityPerUser.Если да, исключите этот ваучер.Но у меня возникают проблемы при сравнении соответствующих полей, например, если voucherId равен 'aaa' , проверьте, если amountBrought> limitedQuantityPerUser.

Я пробовал это

vouchers.find({
         'status': {
          $in: ['OP', 'WG', 'LO', 'SO']
        },
        'details.userReachedLimitedQuantity': {
          $ne: userId
        },
      }, fields, {
        sort: {
          'order': 1
        }
      }

Но это даст мне весь результат, когда userId не равен в списке.не совсем то, что мне нужно.Лучше решить с помощью агрегата?

Пример ресурса JSON-файла

[{
        "_id": "111",
        "details": {
            "limitedQuantityPerUser": "3",
            "userReachedLimitedQuantity": [{
                    "userId": "aaa",
                    "quantityBrought": "2"
                },
                {
                    "userId": "bbb",
                    "quantityBrought": "1"
                },
                {
                    "userId": "ccc",
                    "quantityBrought": "3"
                }
            ],
            "status": "OP"
        }
    },
    {
        "_id": "222",
        "details": {
            "limitedQuantityPerUser": "2",
            "userReachedLimitedQuantity": [{
                    "userId": "eee",
                    "quantityBrought": "2"
                },
                {
                    "userId": "bbb",
                    "quantityBrought": "1"
                },
                {
                    "userId": "vvv",
                    "quantityBrought": "2"
                }
            ],
            "status": "OP"
        }
    }
]

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Нет идеального ответа, но я сделал фильтр в результате запроса mongod

// Only take matched userId's quantityPurchased
const newResult = result.filter(val => {
  if (!val.details.userReachedLimitedQuantity) {
    return val;
  }
  val.details.userReachedLimitedQuantity= val.details.userReachedLimitedQuantity.filter((o) => {
    return (String(o.userId) == userId)
  });
  if (val.details.userReachedLimitedQuantity[0].quantityBrou < val.details.limitedQuantityPerUser) {
    return val;
  } else {
    return false;
  }
0 голосов
/ 01 января 2019

Вы можете использовать агрегацию ниже, чтобы проверить, превысил ли указанный userId определенный предел.

db.vouchers.aggregate([
    {
        $match: {
            $expr: {
                $allElementsTrue: {
                    $map: {
                        input: "$details.userReachedLimitedQuantity",
                        as: "user",
                        in: {
                            $or: [
                                { $ne: [ "$$user.userId", userId ] },
                                { $lte: [ "$$user.quantityBrought", "$details.limitedQuantityPerUser"  ] }
                            ]
                        }
                    }
                }
            }
        }
    }
])

$ allElementsTrue принимает массив логических значений в качестве параметра.Вы можете использовать $ map , чтобы преобразовать ваши userReachedLimitedQuantity в такие логические значения, проверяя поля userId и quantityBrought.

То есть, если какой-либо элемент равен false, это означает, что quantityBrought этого пользователя больше limitedQuantityPerUser

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