Есть ли в mongodb оператор типа узла - PullRequest
0 голосов
/ 25 марта 2020

Я хочу отфильтровать десятичное значение в дочернем массиве файла json. В приведенном ниже примере кода я хочу применить функцию like, чтобы получить значение json like (t1, t2) в приведенном ниже файле примера.

Пример кода:

db.getCollection('temp').find({},{"temp.text./.*t.*/.value":1})

Пример Json Файл:

{
    "_id" :0"),     
    "temp" : {
        "text" : {
            "t1" : {

                "value" : "960"
            },
            "t2" : {                               
                "value" : "959"
            },
            "t3" : {                
                "value" : "961"
            },
            "t4" : {               
                "value" : "962"
            },
            "t5" : {                               
                "value" : "6.0"
            }

        }
    }   
}

1 Ответ

0 голосов
/ 25 марта 2020

MongoDB не имеет способа фильтровать имена полей напрямую, кроме проекции, что является точным совпадением.

Однако, используя агрегацию, вы можете использовать $ objectToArray, который преобразует объект {"t1" : {"value" : "960"}} в [{"k":"t1","v":{"value":"960"}}]. Затем вы можете фильтровать на основе значения k и использовать $ arrayToObject для преобразования оставленных записей обратно в объект.

.aggregate([
    {$addFields:{
          "temp.text":{
               $arrayToObject:{
                    $filter:{
                        input:{$objectToArray:"$temp.text"},
                        cond:{
                              $regexMatch:{
                                   input:"$$this.k",
                                   regex:/t/
                              }
                        }             
                    }
               }
          }
    }}
])

Playground

...