如何使用mongodb查询嵌入式文档

时间:2017-04-25 03:28:43

标签: sql mongodb

需要帮助构建此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查询来做到这一点?我需要做一些转换吗?

1 个答案:

答案 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();
顺便说一句,它会更快...