首页 > 解决方案 > MongoDB 只返回嵌套的对象数组

问题描述

我有这样一个文件:

   {
      "locale":"en",
      "translations":[
         {
            "name":"translation1",
            "value":"enValue"
         },
         {
            "name":"translation2",
            "value":"enValue"
         },
         {
            "name":"translation3",
            "value":"enValue"
         }
      ]
   },
   {
      "locale":"ru",
      "translations":[
         {
            "name":"translation1",
            "value":"ruValue"
         },
         {
            "name":"translation2",
            "value":"ruValue"
         },
         {
            "name":"translation3",
            "value":"ruValue"
         }
      ]
   }
]

例如,我需要返回 locale 的所有翻译en,但我需要获得唯一的翻译数组,所以结果应该是这样的:

[
         {
            "name":"translation1",
            "value":"enValue"
         },
         {
            "name":"translation2",
            "value":"enValue"
         },
         {
            "name":"translation3",
            "value":"enValue"
         }
      ]

db.test.find({locale: 'en'})的结果是:

      "_id" : "1"
      "locale": en,
      "translations" : [
         {
            "name":"translation1",
            "value":"enValue"
         },
         {
            "name":"translation2",
            "value":"enValue"
         },
         {
            "name":"translation3",
            "value":"enValue"
         }
      ]

但我不想只返回所有翻译的语言环境/ID 信息。我知道有,$elemMatch 但它仅在我想返回单个元素时才有效,例如,带有具体名称的翻译。如何在没有额外数据的情况下返回整个翻译子集???对不起,如果一个问题很愚蠢,我只是在学习 mongo

标签: mongodb

解决方案


您可以使用$unwind$replaceRoot

db.test.aggregate([
  { "$match": { "locale": "en" }},
  { "$unwind": "$translations" },
  { "$replaceRoot": { "newRoot": "$translations" } }
])

推荐阅读