Как найти записи, значения некоторых полей которых равны нулю в mongo

#mongodb

Вопрос:

У меня много датчиков, каждый датчик сообщает данные каждые несколько секунд.

Мне нужно выяснить датчики, все данные которых равны нулю.

Кроме того, мне нужно вычислить нулевое соотношение данных для каждого датчика.

Может ли любой запрос сделать это? Любая помощь будет высоко оценена.

Записи такие

 {
    "_id" : ObjectId("61353065746e5e18a1d7c4ca"),
    "sensor" : "SN54",
    "category" : "w",
    "data" : "7065",
    "time" : ISODate("2021-09-06T05:02:29.308 08:00")
},

{
    "_id" : ObjectId("61353065746e5e18a1d7c4c9"),
    "sensor" : "SN68",
    "category" : "w",
    "data" : "0",
    "time" : ISODate("2021-09-06T05:02:29.308 08:00")
},
 

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

1. можете ли вы добавить примеры данных? и ожидаемых данных после запроса, если это возможно

Ответ №1:

Запрос (если данные были в массиве (нам это не нужно здесь после обновления вопроса))

  • фильтр, чтобы сохранить только ноль, делится на весь размер массива и умножается на 100
  • если вы хотите получить все нули, добавьте совпадение, где percentage=100

Тестовый код здесь

 db.collection.aggregate([
  {
    "$set": {
      "percentage": {
        "$multiply": [
          {
            "$cond": [
              {
                "$eq": [
                  "$data",
                  []
                ]
              },
              0,
              {
                "$divide": [
                  {
                    "$size": {
                      "$filter": {
                        "input": "$data",
                        "as": "d",
                        "cond": {
                          "$eq": [
                            "$d",
                            0
                          ]
                        }
                      }
                    }
                  },
                  {
                    "$size": "$data"
                  }
                ]
              }
            ]
          },
          100
        ]
      }
    }
  }
])
 

Edit1 (для данных, которые не находятся внутри массива)

Тестовый код здесь

 aggregate(
[ {
  "$group" : {
    "_id" : "$sensor",
    "nzero" : {
      "$sum" : {
        "$cond" : [ {
          "$eq" : [ "$data", "0" ]
        }, 1, 0 ]
      }
    },
    "count" : {
      "$sum" : 1
    }
  }
}, {
  "$set" : {
    "sensor" : "$_id"
  }
}, {
  "$project" : {
    "_id" : 0
  }
}, {
  "$project" : {
    "sensor" : 1,
    "percentage" : {
      "$multiply" : [ {
        "$divide" : [ "$nzero", "$count" ]
      }, 100 ]
    }
  }
} ]
)
 

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

1. Извините, пожалуйста, посмотрите образец данных, поле данных не является массивом

2. все в порядке , проверьте обновление, если хотите, вы можете добавить другие аккумуляторы, такие как $avg средний и т. Д