Документ, возвращаемый запросом mongoShell, равен нулю для сравнения столбца в том же документе. - PullRequest
0 голосов
/ 04 мая 2018

У меня есть коллекция с похожей структурой данных

{
   id: 1
   limit: {
        max: 10000,
        used: 0     
   }
}

и я попытался выполнить приведенный ниже запрос, но он дает 0 результатов

db.getCollection('promos').aggregate(
[
{ $match: { id:  1} },
{$match: { $expr: {$gt ["limit.max" , "limit.used"]}}}

])

Я также использовал следующий запрос

db.getCollection('promos').aggregate(
[
{ $match: { id:  1} },
{$match: { "$limit.max": {$gt: "limit.used"}}}

])

Никто из них не дает результата. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 04 мая 2018

Вам необходимо добавить префикс «выражений полей» к $. Это также может быть просто сделано в .find()

db.getCollection('promos').find({
  "id": 1,
  "$expr": { "$gt": [ "$limit.max" , "$limit.used" ] }
})

Или один $match этап, если вам действительно нужно использовать агрегат вместо:

db.getCollection('promos').aggregate([
  { "$match": {
    "id": 1,
    "$expr": { "$gt": [ "$limit.max" , "$limit.used" ] }
  }}
])

Вот как работает $expr, и вы можете «смешать» его с другими обычными операторами запросов на том же этапе запроса или конвейера.

Также см. $gt для общих примеров использования

Конечно, если у вас даже нет MongoDB 3.6, тогда вместо этого вы используете $redact:

db.getCollection('promos').aggregate([
  { "$match": { "id": 1 } },
  { "$redact": {
    "$cond": {
      "if": { "$gt": [ "$limit.max" , "$limit.used" ] },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])

Или используйте $where. Работает во всех версиях:

db.getCollection('promos').find({
  "id": 1,
  "$where": "this.limit.max > this.limit.used"
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...