Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 具有动态匹配条件查询的索引策略_Mongodb_Indexing_Aggregation Framework - Fatal编程技术网

Mongodb 具有动态匹配条件查询的索引策略

Mongodb 具有动态匹配条件查询的索引策略,mongodb,indexing,aggregation-framework,Mongodb,Indexing,Aggregation Framework,我有一个集合,它将保存机器数据和移动数据,数据在通道上捕获,并在单个级别进行维护,无需嵌入对象,结构如下 { "Id": ObjectId("544e4b0ae4b039d388a2ae3a"), "DeviceTypeId":"DeviceType1", "DeviceTypeParentId":"Parent1", "DeviceId":"D1", "ChannelName": "Login", "Timestamp": ISODate("20

我有一个集合,它将保存机器数据和移动数据,数据在通道上捕获,并在单个级别进行维护,无需嵌入对象,结构如下

{
    "Id": ObjectId("544e4b0ae4b039d388a2ae3a"),
    "DeviceTypeId":"DeviceType1",
    "DeviceTypeParentId":"Parent1",
    "DeviceId":"D1",
    "ChannelName": "Login",
    "Timestamp": ISODate("2013-07-23T19:44:09Z"),
    "Country": "India",
    "Region": "Maharashtra",
    "City": "Nasik",
    "Latitude": 13.22,
    "Longitude": 56.32,
    //and more 10 - 15 fields
}
{$match:{"DeviceTypeId":{"$in":["DeviceType1"]},"Timestamp":{"$gte":ISODate("2013-07-23T00:00:00Z"),"$lt":ISODate("2013-08-23T00:00:00Z")}}}
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "DB.channel_data"
        },
        {
                "v" : 1,
                "key" : {
                        "DeviceType" : 1,
                        "Timestamp" : 1
                },
                "name" : "DeviceType_1_Timestamp_1",
                "ns" : "DB.channel_data"
        },
        {
                "v" : 1,
                "key" : {
                        "DeviceTypeParentId" : 1,
                        "Timestamp" : 1
                },
                "name" : "DeviceTypeParentId_1_Timestamp_1",
                "ns" : "DB.channel_data"
        }
]
大多数查询都是聚合查询,用于分析仪表板和实时分析,$match管道如下

{
    "Id": ObjectId("544e4b0ae4b039d388a2ae3a"),
    "DeviceTypeId":"DeviceType1",
    "DeviceTypeParentId":"Parent1",
    "DeviceId":"D1",
    "ChannelName": "Login",
    "Timestamp": ISODate("2013-07-23T19:44:09Z"),
    "Country": "India",
    "Region": "Maharashtra",
    "City": "Nasik",
    "Latitude": 13.22,
    "Longitude": 56.32,
    //and more 10 - 15 fields
}
{$match:{"DeviceTypeId":{"$in":["DeviceType1"]},"Timestamp":{"$gte":ISODate("2013-07-23T00:00:00Z"),"$lt":ISODate("2013-08-23T00:00:00Z")}}}
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "DB.channel_data"
        },
        {
                "v" : 1,
                "key" : {
                        "DeviceType" : 1,
                        "Timestamp" : 1
                },
                "name" : "DeviceType_1_Timestamp_1",
                "ns" : "DB.channel_data"
        },
        {
                "v" : 1,
                "key" : {
                        "DeviceTypeParentId" : 1,
                        "Timestamp" : 1
                },
                "name" : "DeviceTypeParentId_1_Timestamp_1",
                "ns" : "DB.channel_data"
        }
]

我的许多DAL层find查询和findOne查询大多基于标准DeviceTypeDeviceTypeParentId

这个集合是巨大的,并且不断增长,我使用了复合索引来支持这个查询,索引如下

{
    "Id": ObjectId("544e4b0ae4b039d388a2ae3a"),
    "DeviceTypeId":"DeviceType1",
    "DeviceTypeParentId":"Parent1",
    "DeviceId":"D1",
    "ChannelName": "Login",
    "Timestamp": ISODate("2013-07-23T19:44:09Z"),
    "Country": "India",
    "Region": "Maharashtra",
    "City": "Nasik",
    "Latitude": 13.22,
    "Longitude": 56.32,
    //and more 10 - 15 fields
}
{$match:{"DeviceTypeId":{"$in":["DeviceType1"]},"Timestamp":{"$gte":ISODate("2013-07-23T00:00:00Z"),"$lt":ISODate("2013-08-23T00:00:00Z")}}}
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "DB.channel_data"
        },
        {
                "v" : 1,
                "key" : {
                        "DeviceType" : 1,
                        "Timestamp" : 1
                },
                "name" : "DeviceType_1_Timestamp_1",
                "ns" : "DB.channel_data"
        },
        {
                "v" : 1,
                "key" : {
                        "DeviceTypeParentId" : 1,
                        "Timestamp" : 1
                },
                "name" : "DeviceTypeParentId_1_Timestamp_1",
                "ns" : "DB.channel_data"
        }
]
现在,我们将在DeviceId上添加对匹配标准的支持,如果我采用与DeviceType相同的策略,并且DeviceTypeParentId不好,因为我用我目前的方法,我正在创建许多索引,而且大多数索引都是相同和巨大的。 因此,它们的索引是否有任何好的方法。我读过一些关于索引交叉点的文章,但不确定它会有什么帮助


如果我采用了任何错误的方法,请指出,因为这是我的第一个项目,也是我第一次使用MongoDB。

这些索引看起来都适合您的查询,包括您建议的新索引。就快速查询而言,支持三种查询的三个单独索引是总体上最好的选择。您可以在每个字段上放置索引,并让计划者使用索引交集,但它不如复合索引好。索引不同,因为它们支持不同的查询

我认为真正的问题是,索引的(显然)大内存占用在这一点上实际上是一个问题吗?由于分页索引和磁盘外的数据,您是否有很多页面错误?

可能有用