在阅读了所有可以想到的在线资源后,仍然无法想到该解决方案。基本上,我在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})
我需要的是所有包含某种类型语言的文档-此字段也是可选的。我该如何构造这样的查询?
另外,如果此问题是标准问题,请向我提供信息,以便我可以更新问题。
您在这里遇到的问题是文档中没有数组-您只有带有未知键的嵌套对象。要查询这种结构,您需要使用$ objectToArray运算符将这些嵌套文档转换为数组。
db.col.aggregate([
{
$addFields: {
languages: { $objectToArray: "$a.b.languages" }
}
},
{
$match: { "languages.v.type": "secret" }
},
{
$project: { languages: 0 }
}
])
上面的代码会将a.b.languages
path转换为键和值的数组(带有k
和的对象v
),因此您可以直接查询引用languages.v.type
。$addFields
并$project
用于生成然后删除可以查询的临时字段。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句