MongoDB + C#:GUID 字段上的复合索引不是 chosen/used

MongoDB + C#: Compound Indexes on GUID fields not being chosen/used

在进一步了解索引如何在 MongDB 上工作之后,我决定改进一个查询,该查询在几个月后将在我目前正在从事的项目中大量使用。基本上 collection 具有以下结构:

{
   _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}});

对于这种情况,我在 collection:

中创建了一个这样的索引
db.UserBooks.createIndex({BookId: 1, UserId: 1, ModificationDate: -1})

之后,我 运行 使用 BookId 和 UserId 在 Mongo Shell 上使用 explain() 进行查询,令我惊讶的是新索引没有被使用!我现在不在工作,所以我无法 post 此处可解释的结果,但我可以说它对 20.000 个密钥和文档进行了 COLLSCAN!

我试图在网上寻找答案,但找不到太多东西。我确实发现 MongoDB 不能很好地处理 GUID 类型。这提出了几个问题:

1:MongoDB真的没有"like"GUID的吗?

2:没有 "sense" 对 GUID 类型进行升序或降序排序。所以,当我在这些类型上创建索引时,我是否应该始终指定 1:升序?有关系吗?

3:在 collection 上查询具有 Mongo Shell 上的 GUID 时,它们显示为 BinaryData(hash)。为什么?

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

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