使用MongoDB _id字段作为具有多个字段的复合字段

时间:2016-08-25 08:34:15

标签: mongodb spring-data-mongodb bson

由于mongodb中的每个集合在_id列上都有一个默认索引,因此我想将它用于我的场景,如下所示。

我的收藏如下,

{
    "_id":{
            "timestamp" : ISODate("2016-08-24T23:22:20.201Z"),
            "departmentname" : "sales",
            "city":"NJ"
        }

        //Other fields in my collection
}

通过这种结构,我可以查询如下,

db.getCollection('test').find(
{
    "_id" : {
        "timestamp" : ISODate("2016-08-21T23:22:20.201Z"),
        "departmentname" : "sales",
        "city":"NJ"
    }
}
)

但是,当我通过一个或多个字段查询_id列的一部分时,如下所示

db.getCollection('test').find(
{
    "_id" : {
        "timestamp" : ISODate("2016-08-21T23:22:20.201Z")
    }
}
)

(OR)

db.getCollection('test').find(
{
    "_id" : {
        "departmentname" : "sales"
    }
}
)

(OR)

db.getCollection('test').find(
{
    "_id" : {
        "departmentname" : "sales",
        "city":"NJ"
    }
}
)

我没有看到任何文件返回

当我使用.explain()查看时,我发现它使用了Index但没有找到任何文档。

另外,我想在时间戳字段上进行日期范围查询,并在_id列中的一个或多个字段上进行查询,如下所示,

db.getCollection('test').find(
{

    "_id.timestamp" : { 
        "$gte": ISODate("2011-08-21T23:22:20.201Z")
    },
    "_id.departmentname" : "sales"
}
)

但是,我没有看到任何文件返回。当我运行.explain()时,我发现它使用了colscan而不是索引。

有人可以通过我的_id列上的一个或多个字段以正确的方式帮助我。

谢谢,

1 个答案:

答案 0 :(得分:4)

在第一种情况下,您可以尝试以下查询: -

db.getCollection('test').find(
{
    "_id.timestamp" :  ISODate("2016-08-21T23:22:20.201Z")
})

这适用于多个领域:

db.getCollection('test').find(
{
    "_id.timestamp" :  ISODate("2016-08-21T23:22:20.201Z"), 
    "_id.departmentname" :  "sales", 
})