Существует ли запрос mongodb для объединения полей в определенном документе mongodb

#java #spring #mongodb

#java #весна #mongodb

Вопрос:

Итак, предположим, у меня есть документ, подобный :

 {
  "country": "USA",
  "capital": "Washington DC",
  "language": "English",
  "other": {
    "China": {
      "capital": "Shanghai",
      "language": "Chinese"
    },
    "Spain": {
      "capital": "Madrid",
      "language": "Spanish"
    }
  }
}
  

Теперь я хочу вернуть свой документ как:

 {
  "country": "USA",
  "capital": "Washington DC",
  "language": "English",
}
  

когда я выбираю страну как «США», но когда у меня установлена страна как «Испания», я хочу, чтобы мой запрос mongodb возвращал документ как:

 {
  "country": "Spain",
  "capital": "Madrid",
  "language": "Spanish",
}
  

Поля должны объединяться в соответствии со страной, указанной в поле «другое».
Как я могу этого добиться?

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

1. Вы вкладываете ключ spain and china в other раздел, но структура документа, которую вы просматриваете из запроса mongo, немного отличается от той, что у вас есть в документе, храните сведения о каждой стране как отдельную запись в коллекции, тогда вы сможете получить к ней доступ.

Ответ №1:

Попробуйте это:

 country = "Spain"

db.collection.aggregate([
   // Make a uniform structure (why do you have 'USA' and 'other'?)
   { $replaceRoot: { newRoot: { $mergeObjects: ["$other", { USA: { capital: "$capital", language: "$language" } }] } } },
   { $project: { countries: { $objectToArray: "$$ROOT" } } },
   {
      $set: {
         countries: {
            $filter: {
               input: "$countries",
               cond: { $eq: ["$$this.k", country] }
            }
         }
      }
   },
   {
      $replaceRoot: {
         newRoot: {
            $mergeObjects: [
               { country: { $first: "$countries.k" } },
               { $first: "$countries.v" }]
         }
      }
   }
])