需要帮助构建此mongo查询。 到目前为止,我可以在第一级查询,但无法在下一个嵌入级别查询("标签"> 2")
例如,文档结构如下所示:
> db.versions_20170420.findOne();
{
"_id" : ObjectId("54bf146b77ac503bbf0f0130"),
"account" : "foo",
"labels" : {
"1" : {
"name" : "one",
"color" : "color1"
},
"2" : {
"name" : "two",
"color" : "color2"
},
"3" : {
"name" : "three",
"color" : "color3"
}
},
"profile" : "bar",
"version" : NumberLong("201412192106")
我可以在第一级(account, profile
)过滤此查询。
db.profile_versions_20170420.find({"account":"foo", "profile": "bar"}).pretty()
但是,鉴于这种结构,我正在寻找"label"
>的文件。 "2"
。它看起来不像"2"
是一个数字,而是一个字符串。有没有办法构建mongo查询来做到这一点?我需要做一些转换吗?
答案 0 :(得分:1)
如果我正确理解您和您的数据结构,"label" > "2"
表示对象标签必须包含属性labels.3
,并且可以使用下一个代码轻松检查:
db.profile_versions_20170420.find(
{"account": "foo", "profile": "bar", "labels.3": {$exists: true}}
).pretty();
但它并不意味着你的对象包含至少3个属性,因为它不是$size
函数来计算数组中元素的数量,我们不能使用$ size因为labels
对象不是数组。因此,在我们的情况下,我们只知道labels
具有属性3
,即使它是标签包含的唯一属性。
您可以改进查找条件:
db.profile_versions_20170420.find({
"account": "foo",
"profile": "bar",
"labels.1": {$exists: true},
"labels.2": {$exists: true},
"labels.3": {$exists: true}
}).pretty();
并确保labes
包含元素1, 2, 3
,但在这种情况下,您必须在文档中插入/更新/删除数据期间关注应用程序级别的对象结构。
作为另一种选择,您可以更新数据库并添加额外字段labelsConut
,之后您将能够运行如下查询:
db.profile_versions_20170420.find(
{"account": "foo", "profile": "bar", "labelsConut": {$gt: 2}}
).pretty();
顺便说一句,它会更快...