MongoDB:嵌套密钥的存在

时间:2015-03-25 10:06:50

标签: mongodb

我正在使用一些嵌套文档......如何检查 只存在一把钥匙?

即..如果我想返回任何嵌套键“work”的记录,其中父键是动态的。

这是应该返回的记录:

{ 
    "_id" : ObjectId("123"), 
    "customer_name" : "test user", 
    "123456" : { 
            "home" : { 
                    "id" : "1536734296", 
                    "last" : "2011-04-14 16:44:09", 
            } 
            "work" : { 
                    "id" : "1536734296", 
                    "last" : "2011-04-14 16:44:09", 
            } 

    }, 
    "321456" : { 
            "home" : { 
                    "id" : "1536734296", 
                    "last" : "2011-04-14 16:44:09", 
            } 
            "work" : { 
                    "id" : "1536734296", 
                    "last" : "2011-04-14 16:44:09", 
            } 

    }, 
    "789654" : { 
            "home" : { 
                    "id" : "1536734296", 
                    "last" : "2011-04-14 16:44:09", 
            } 
            "work" : { 
                    "id" : "1536734296", 
                    "last" : "2011-04-14 16:44:09", 
            } 

    }, 
    "createad" : "2011-04-14 16:44:09" 
} 

以下是不应返回的记录:

{ 
    "_id" : ObjectId("123"), 
    "customer_name" : "test user", 
    "123456" : { 
            "home" : { 
                    "id" : "1536734296", 
                    "last" : "2011-04-14 16:44:09", 
            } 
    }, 
    "321456" : { 
            "home" : { 
                    "id" : "1536734296", 
                    "last" : "2011-04-14 16:44:09", 
            } 
            "home1" : { 
                    "id" : "1536734296", 
                    "last" : "2011-04-14 16:44:09", 
            } 

    }, 
    "321543" : { 
            "home" : { 
                    "id" : "1536734296", 
                    "last" : "2011-04-14 16:44:09", 
            } 
            "home1" : { 
                    "id" : "1536734296", 
                    "last" : "2011-04-14 16:44:09", 
            } 

    }, 
    "createad" : "2011-04-14 16:44:09" 
} 

我的猜测会是这样的:     db.find({ “*工作”:{ “$存在”:真正}}) 任何想法?

2 个答案:

答案 0 :(得分:2)

将值作为键并且当前(也可能在将来)也不是一个好的做法,因此不可能在字段名中使用通配符查询MongoDB集合。所以我建议按照这个模型重新设计模式:

"_id" : ObjectId("55128d6315f3df650f2038cf"),
"customer_name" : "test user",
"createad" : "2011-04-14 16:44:09",
"data" : [ 
    {
        "key" : "123456",
        "home" : {
            "id" : "1536734296",
            "last" : "2011-04-14 16:44:09"
        },
        "work" : {
            "id" : "1536734296",
            "last" : "2011-04-14 16:44:09"
        }
    }, 
    {
        "key" : "321456",
        "home" : {
            "id" : "1536734296",
            "last" : "2011-04-14 16:44:09"
        },
        "work" : {
            "id" : "1536734296",
            "last" : "2011-04-14 16:44:09"
        }
    }, 
    {
        "key" : "789654",
        "home" : {
            "id" : "1536734296",
            "last" : "2011-04-14 16:44:09"
        },
        "work" : {
            "id" : "1536734296",
            "last" : "2011-04-14 16:44:09"
        }
    }
]

}

您可以按如下方式查询

db.collection.find({ "data.work" : { $exists : true, $ne : null } })

检查work数组中是否存在data字段。

答案 1 :(得分:0)

如果您的父键不同,则必须通过它循环获取应用程序的所有数据。 因为mongodb存储数据的方式,如果你有不同的父键,你不能进行查询。您必须将所有文档都存入您的应用程序并通过它循环并自行检查。

如果您有大量数据并且不想将所有数据都提供给您的应用程序,我建议您以不同的方式排列数据,这样您就可以更快地查询数据