Пользовательский возвращаемый агрегат MongoDB

Я пытаюсь провести некоторое тестирование с MongoDB, и я понял некоторые из более простых запросов MySQL к MongoDB. Теперь у меня есть немного более сложный запрос.

У меня есть этот запрос, который сообщает мне, было ли сообщение в определенный период от определенного пользователя:

SELECT CASE WHEN count(1) = 0 THEN false ELSE true END AS 'value'
FROM messages m
WHERE m.time BETWEEN 0 AND 1652471890 AND m.user_id = '256f5280-fb49-4ad6-b7f5-65c4329d46e0';

В настоящее время я пытаюсь сделать это, чтобы подсчитать сумму и выдать пользовательское значение 0/1:

Текущий агрегат MongoDB

    db.messages.aggregate([
        { $match: 
            {
            $and: [
              {user_id: "256f5280-fb49-4ad6-b7f5-65c4329d46e0"},
              {time: {$gt: 1622471890, $lt: 1822471890}}
            ]
            } 
        },
        { $count: "value"}
    ])

Набор данных:

    [
    {
        "time": 1422471890,
        "user_id": "256f5280-fb49-4ad6-b7f5-65c4329d46e0",
        "message": "This is an example of my db"
    },
    {
        "time": 1622471890,
        "user_id": "256f5280-fb49-4ad6-b7f5-65c4329d46e0",
        "message": "This is an example of my db (1)"
    },
    {
        "time": 1622471890,
        "user_id": "256f5280-fb49-4ad6-b7f5-65c4329d46e0",
        "message": "This is an example of my db (2)"
    },
    {
        "time": 1622471890,
        "user_id": "e194d667-d79f-4262-94b1-ecf4561c9418",
        "message": "This is an example of my db (3)"
    },
    {
        "time": 1922471890,
        "user_id": "256f5280-fb49-4ad6-b7f5-65c4329d46e0"<
        "message": "This is an example of my db (4)"
    }
    ]

Возврат:

С этим набором данных он возвращается:

{ "value" : 2 }

Я пытаюсь вернуть его:

Если количество > 0: { "value": 1 }

Если количество <= 0: { "value": 0 }

Было бы полезно, если бы был предоставлен некоторый образец набора данных и соответствующий вывод.

ray 16.05.2022 21:51

У меня есть общие данные в моей базе данных (user_id, сообщение и время). Я хочу вернуться, если существует определенное сообщение в определенный период времени. Возврат должен быть 0 или 1.

ricxk 16.05.2022 22:04

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

ray 16.05.2022 22:13

@ray Конечно! Извините, я обновил вопрос. Я надеюсь сделать это лучше.

ricxk 16.05.2022 22:30

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

ray 16.05.2022 22:35

Хорошо, без проблем, я сделал это. Я думаю, теперь все в порядке.

ricxk 16.05.2022 22:50
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
6
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам просто нужен еще один $addFields этап, чтобы применить $cond к вашему value

db.collection.aggregate([
  {
    $match: {
      $and: [
        {
          user_id: "256f5280-fb49-4ad6-b7f5-65c4329d46e0"
        },
        {
          time: {
            $gte: 1622471890,
            $lt: 1822471890
          }
        }
      ]
    }
  },
  {
    "$count": "value"
  },
  {
    "$addFields": {
      "value": {
        "$cond": {
          "if": {
            "$gt": [
              "$value",
              0
            ]
          },
          "then": "$value",
          "else": 0
        }
      }
    }
  },
  {
    "$unionWith": {
      "coll": "collection",
      "pipeline": [
        {
          $limit: 1
        }
      ]
    }
  },
  {
    "$sort": {
      value: -1
    }
  },
  {
    $limit: 1
  },
  {
    "$project": {
      _id: 0,
      value: {
        "$ifNull": [
          "$value",
          0
        ]
      }
    }
  }
])

Вот Игровая площадка Монго для справки.

О, это близко, когда не найден документ, он возвращается пустым, он не возвращает { "значение": 0}, существует ли один способ ответить, когда "документ не найден"?

ricxk 17.05.2022 00:11

@rickxk обновил ответ

ray 17.05.2022 00:34

Другие вопросы по теме