Агрегирование Mongodb с $ addFileds и условием - PullRequest
0 голосов
/ 27 января 2019

Учитывая, что:

дБ:

{
   id:"112",
   val1: {val:""},
   val2: {val:"123"},
}

Я хотел бы запустить скрипт, который обновляет новое поле в соответствии с результатом агрегации. Результат равен true, если одно из значений (val1, val2) пусто

Ниже приведено то, что я сделал с агрегацией, а затем я хотел бы перейти к for и обновить все строки:

db.valTest.aggregate(
    [{
            "$addFields": {
                "val.selected": {
                    '$or': [{
                        'val1.val': ''
                    }, {
                        'val2.val': ''
                    }]

                }
            }
        },
        {
            "$group": {
                "_id": "$_id",
                "id": {
                    "$first": "$id"
                },
                "value": {
                    "$first": "val1.val"
                },
                "result": {
                    "$push": {
                        "val": "val1.val",
                        "selected": "val.selected"
                    }
                }
            }
        }

    ]
)

Но я не получаю правильный результат. Я хотел бы получить результат как:

{
   id:"112",
   val1: {val:""},
   val2: {val:"123"},
   result: true
},
{
   id:"114",
   val1: {val:"4545"},
   val2: {val:"123"},
   result: false
}

В настоящее время я получаю следующую ошибку:

"message" : "FieldPath field names may not contain '.'.",

1 Ответ

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

Вам необходимо использовать $eq оператор агрегирования для критериев соответствия

db.collection.aggregate([
  { "$addFields": {
    "result": {
      "$cond": [
        { "$or": [{ "$eq": ["$val1.val", ""] }, { "$eq": ["$val2.val", ""] }] },
        true,
        false
      ]
    }
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...