MongoDB + C#:未选择/使用GUID字段的复合索引

时间:2015-08-30 13:47:57

标签: c# mongodb mongodb-.net-driver database-performance

在了解了有关索引如何在MongDB上工作的更多信息后,我决定改进一个查询,该查询在几个月内将在我正在进行的项目中使用。基本上该集合具有以下结构:

{
   _id: UUID("0f8fad5b-d9cb-469f-a165-70867728950e"),
   Title: "ABC",
   BookId: UUID("7c9e6679-7425-40de-944b-e07fc1f90ae7"),
   UserId: UUID("7c9e6579-7425-40de-944b-e07fc1f90az9"),
   ModificationDate: ISODATE(...),
   ...
   ...
}

查询将有两种主要格式:

该应用仅使用BookId和UserId进行过滤

db.userBooks.find({BookId: UUID("7c9e6679-7425-40de-944b-e07fc1f90ae7"), UserId: UUID("7c9e6579-7425-40de-944b-e07fc1f90az9")});

该应用现在正在使用BookId,UserId和ModificationDate进行过滤

db.userBooks.find({BookId: UUID("7c9e6679-7425-40de-944b-e07fc1f90ae7"), UserId: UUID("7c9e6579-7425-40de-944b-e07fc1f90az9"), ModificationDate: {$qt: "2015-08-30: 10:25:00.100}});

对于这种情况,我在我的集​​合中创建了一个这样的索引:

db.UserBooks.createIndex({BookId: 1, UserId: 1, ModificationDate: -1})

之后,我使用了Explao()在Mongo Shell上使用BookId和UserId运行了一个查询,令我惊讶的是没有使用新的索引!我现在不上班,所以我不能在这里发布可解释的结果,但我可以说它在20.000键和文件上做了一个COLLSCAN!

我试图在网上寻找答案,找不到太多东西。我发现的是MongoDB与GUID类型不兼容。这提出了几个问题:

1:MongoDB真的不喜欢“GUID”吗?

2:对GUID类型的升序或降序排序没有“意义”。那么,当我在这些类型上创建索引时,我应该始终指定1:升序吗?有关系吗?

3:查询Mongo Shell上具有GUID的集合时,它们显示为BinaryData(哈希)。为什么?

此特定应用程序具有SQL Server数据库。当我们有突变数据或需要非常快速的访问时,我们在某些情况下使用MongoDB。这些GUID类型是SQL Server数据库中的Id。有谁知道如何解决这个问题?还是指点我的方向?

1 个答案:

答案 0 :(得分:1)

  1. 因此MongoDb使用GUID并将它们解释为UUID数据格式(所谓的BinData)。有关详细信息,请参阅:http://docs.mongodb.org/manual/reference/bson-types/http://docs.mongodb.org/manual/reference/method/UUID/
  2. 在练习中,我从未看到GUID索引的顺序很重要的情况,所以默认情况下你可以使用升序。
  3. 请参阅第1页,如文档中所述 - GUID实际上是MongoDb BSON类型系统中的BinData格式。因此,唯一的字符串或ObjectId是用作主键(_id)的参考类型。 结果我们在评论对话中实现了 - 复合(多字段)索引与C#驱动程序查询一起使用。