使用Mongodb _id字段部分查询一个或多个复合字段

时间:2016-08-25 20:41:32

标签: mongodb spring-data-mongodb

我使用_id字段作为我的文档的复合键,其中包含2个字段。

{
    "_id" : {
        "timestamp" : ISODate("2016-08-25T05:43:00.000-19:30"),
        "hostName" : "nj"
    }

}

我注意到它我只能查询是否在查询中同时使用这两个字段。如果我使用其中一个,我不会收到任何文件。

db.getCollection('sales').find(
{
    "_id" : {
            "hostName" : "tryme"     
    }

}

db.getCollection('sales').find(
{
    "_id" : {
            "timestamp" : ISODate("2016-08-25T05:43:00.000-19:30")   
    }

}

上述脚本不会返回任何文件。

另外,我无法在日期字段中使用$ gte / $ lte运算符

db.getCollection('sales').find(
{
    "_id" : {
        "timestamp" : {
            "$lte":ISODate("2016-08-25T04:51:00.000-19:30")
        },
        "hostName" : "tryme"     
    }

}

)

以上也不会返回任何文档。

以下查询有效但我看到,根据explain(),它使用了集合扫描并且未使用索引。

db.getCollection('sales').find(
{
    "_id.timestamp" : ISODate("2016-08-25T04:51:00.000-19:30"),
    "_id.hostName" : "tryme"     
}

)

==

db.getCollection('sales').find(
{
    "_id.timestamp" : {
        "$gte": ISODate("2016-08-25T04:52:00.000-19:30")
    },
    "_id.hostName" : "tryme"     
}

)

不确定我是否已了解_id字段的工作原理。

基本上,我希望能够使用复合查询的部分字段,并且还可以使用日期类型字段进行范围查询,例如/ greaterthan / less等等,同时利用_id字段上的索引。 / p>

有人可以帮我解决这个问题。

谢谢,

1 个答案:

答案 0 :(得分:0)

来自the docs

  

MongoDB使用点表示法来访问数组的元素   访问嵌入文档的字段。

您的第一次尝试不起作用,因为您将一个嵌套对象作为匹配相等的查询传递,而是使用点表示法。