未使用日期的嵌入式文档索引

杰拉德·里巴斯(Gerard Ribas)

我是使用MongoDB的新手,并且为此类文档提供了一个收藏夹:

{
"_id" : {
    "coordinate" : {
        "latitude" : 532144,
        "longitude" : -33333
    },
    "margin" : "N"
},
"prices" : [ 
    {
        "type" : "GAS_95",
        "price" : 1370,
        "date" : ISODate("2014-05-03T18:39:13.635Z")
    }, 
    {
        "type" : "DIESEL_A",
        "price" : 1299,
        "date" : ISODate("2014-05-03T18:39:13.635Z")
    }, 
    {
        "type" : "DIESEL_A_NEW",
        "price" : 1350,
        "date" : ISODate("2014-05-03T18:39:13.635Z")
    }, 
    {
        "type" : "GAS_98",
        "price" : 1470,
        "date" : ISODate("2014-05-03T18:39:13.635Z")
    }
]

}

我需要检索特定日期的价格,因此我运行以下查询:

db.gasStation.aggregate(
{ "$unwind" : "$prices"}, 
{ "$match" : { 
    "_id" : { 
        "coordinate" : { 
            "latitude" : 532144 , 
            "longitude" : -33333} , 
            "margin" : "N"
        } , 
    "prices.date" : { 
        "$gte" : ISODate("2014-05-02T23:00:00.000Z") , 
        "$lte" : ISODate("2014-05-03T22:59:59.999Z")
    }
}

});

一切正常,我检索了文档,但我认为可以改进,我试图为_id和prices.date创建索引:

db.gasStation.ensureIndex( { 
    "_id" : 1,
    "prices.date" : 1
} )

之后,我尝试查看索引中是否使用了带有explain选项的索引,但未使用任何索引:

{
"stages" : [
    {
        "$cursor" : {
            "query" : {

            },
            "plan" : {
                "cursor" : "BasicCursor",
                "isMultiKey" : false,
                "scanAndOrder" : false,
                "allPlans" : [
                    {
                        "cursor" : "BasicCursor",
                        "isMultiKey" : false,
                        "scanAndOrder" : false
                    }
                ]
            }
        }
    },
    {
        "$unwind" : "$prices"
    },
    {
        "$match" : {
            "_id" : {
                "coordinate" : {
                    "latitude" : 532144,
                    "longitude" : -33333
                },
                "margin" : "N"
            },
            "prices.date" : {
                "$gte" : ISODate("2014-05-02T23:00:00Z"),
                "$lte" : ISODate("2014-05-03T22:59:59.999Z")
            }
        }
    }
],
"ok" : 1

}

我的查询是否不适合使用索引?我在MongoDB文档上读到,唯一不使用索引的管道是$ group,但我没有使用该功能。

约翰·彼得罗恩

尝试重新安排您的聚集管道运营商。例如,此查询:

db.gasStation.aggregate([
{ "$match" : {
    "_id" : {
        "coordinate" : {
            "latitude" : 532144 ,
            "longitude" : -33333} ,
            "margin" : "N"
        }
}},
{ "$unwind" : "$prices"},
{ "$match" : {
    "prices.date" : {
        "$gte" : ISODate("2014-05-02T23:00:00.000Z") ,
        "$lte" : ISODate("2014-05-03T22:59:59.999Z")
    }
}}

], {explain:true});

产生此输出,现在确实显示一些索引用法:

{
    "stages" : [
        {
            "$cursor" : {
                "query" : {
                    "_id" : {
                        "coordinate" : {
                            "latitude" : 532144,
                            "longitude" : -33333
                        },
                        "margin" : "N"
                    }
                },
                "plan" : {
                    "cursor" : "IDCursor",
                    "indexBounds" : {
                        "_id" : [
                            [
                                {
                                    "coordinate" : {
                                        "latitude" : 532144,
                                        "longitude" : -33333
                                    },
                                    "margin" : "N"
                                },
                                {
                                    "coordinate" : {
                                        "latitude" : 532144,
                                        "longitude" : -33333
                                    },
                                    "margin" : "N"
                                }
                            ]
                        ]
                    }
                }
            }
        },
        {
            "$unwind" : "$prices"
        },
        {
            "$match" : {
                "prices.date" : {
                    "$gte" : ISODate("2014-05-02T23:00:00Z"),
                    "$lte" : ISODate("2014-05-03T22:59:59.999Z")
                }
            }
        }
    ],
    "ok" : 1

关键是要尝试使诸如$ match和$ sort之类的管道运算符在管道的开头处预先使用索引来限制访问多少数据并将其传递到聚合的其余部分。您可以使用上面的示例来做更多的事情来提高性能,但这应该使您对如何实现它有了一个很好的了解。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

整个嵌入式文档的索引

来自分类Dev

何时使用嵌入式文档MongoDB

来自分类Dev

在mongodb nodejs中更新双嵌套的嵌入式文档,而无需使用数字索引

来自分类Dev

使用索引键更新mongo文档中大型嵌入式数组的优化方法

来自分类Dev

使用Java在MongoDB中的嵌入式文档中索引和搜索“数组”

来自分类Dev

索引嵌入式文档的键到底意味着什么?

来自分类Dev

在Mongodb中的嵌入式文档上设置索引

来自分类Dev

Mongoid嵌入式文档属于_嵌入式文档

来自分类Dev

如何使用Mongoengine删除嵌入式文档?

来自分类Dev

如何在嵌入式文档数组上使用$ geoNear?

来自分类Dev

使用Presto查询MongoDB嵌入式/嵌套文档的数组

来自分类Dev

使用Java从文档中提取嵌入式文件

来自分类Dev

在Django,Python中使用MongoEngine查询嵌入式文档

来自分类Dev

使用python(pymongo)在mongodb中编辑嵌入式文档

来自分类Dev

使用JSON访问mongodb的嵌入式文档

来自分类Dev

如何要求Riak 1.4进行索引,然后能够基于嵌入式文档的属性搜索文档?

来自分类Dev

mongodb汇总嵌入式文档值

来自分类Dev

Rails 4 MongoID嵌入式文档

来自分类Dev

Mongoengine-嵌入式文档过滤

来自分类Dev

_id的Mongoose findOne嵌入式文档

来自分类Dev

mongoengine查询嵌入式文档列表

来自分类Dev

将对象插入嵌入式文档

来自分类Dev

mongoid-查询嵌入式文档

来自分类Dev

防止创建空的嵌入式文档

来自分类Dev

获取所有嵌入式文档

来自分类Dev

嵌入式文档中的批量更新

来自分类Dev

如何验证mongodb嵌入式文档

来自分类Dev

Mongo嵌入式文档字段查询

来自分类Dev

mongodb汇总嵌入式文档值

Related 相关文章

热门标签

归档