Найти значение поля документов MongoDB, используя другое значение поля в качестве ключа - PullRequest
1 голос
/ 28 февраля 2020

Образец документа:

{
  key: "search",
  phaseStatus: {
    search: "Finish",
    write: "Ongoing"    
  }
}

И я хотел бы выяснить, сколько фазового документа документа имеет значение «Fini sh», какая фаза определяется «ключом».

Например, в этом документе ключом является «поиск», поэтому я хочу запросить «phaseStatus.search». Если ключ другого документа - «запись», он запросит «phaseStatus.write».

Я пытаюсь $filter, но его выражение должно быть массивом. Я тоже попробую вот так:

collection.aggregations([{
  $match: {
    "phaseStatus.$key": "Finish"
  }
}])

Но не сработало. Как я могу запросить поле Dynami c?

1 Ответ

0 голосов
/ 28 февраля 2020

Вы можете попробовать запрос ниже:

Запрос:

db.collection.aggregate([
    {
        $addFields: {
            phaseStatus: {
                $arrayElemAt: [ // As filter returns an array of object, get first object out of an array 
                    {
                        $filter: {
                            input: { // Converted phaseStatus into an array of objects[{k: key, v : value}]
                                $objectToArray: "$phaseStatus"
                            },
                            cond: { // Match the object which has k = $key's value
                                $eq: [
                                    "$$this.k",
                                    "$key"
                                ]
                            }
                        }
                    },
                    0
                ]
            }
        }
    },
    {
        $addFields: {
            phaseStatus: "$phaseStatus.v" // get the value of v field from phaseStatus object & assign it to phaseStatus field
        }
    },
    {
        $match: {
            phaseStatus: "Finish"
        }
    }
])

Тест: MongoDB-Playground

...