如何在mongo中找到包含属性的文档

时间:2019-01-21 15:50:59

标签: mongodb mongodb-query

阅读了所有我可以想到的在线资源后,仍然无法想到该解决方案。基本上,我在mongo中有包含以下数据的文档:

// 1
{
  a: {
    b: {
      languages: {
        en: {
          text: "en",
          type: "secret"
        },
        de: {
          text: "de"
        }
      }
    }
  }
}
//2
{
  a: {
    b: {
      languages: {
        fr: {
          text: "fr"
        },
        de: {
          text: "de",
          type: "public"
        }
      }
    }
  }
},

这将使我得到第一个文档,无论我将secret更改为什么都无所谓:

db.products.findOne({"a.b.languages": {$exists: {$elemMatch: {"type": {$eq: "secret"}}}}}, {"key": 1, "a.b.languages": 1})

我想要的是所有包含某些类型语言的文档-此字段也是可选的。我该如何构造这样的查询?

如果此问题是标准问题,请提供我的信息,以便我可以更新问题。

1 个答案:

答案 0 :(得分:2)

您在这里遇到的问题是文档中没有数组-您只有带有未知键的嵌套对象。要查询这种结构,您需要使用$objectToArray运算符将这些嵌套文档转换为数组。

db.col.aggregate([
    {
        $addFields: {
            languages: { $objectToArray: "$a.b.languages" }
        }
    },
    {
        $match: { "languages.v.type": "secret" }
    },
    {
        $project: { languages: 0 }
    }
])

以上代码会将a.b.languages路径转换为键和值(具有kv字段的对象)的数组,因此您可以直接查询languages.v.type$addFields$project用于生成然后删除可以查询的临时字段。