问题标签 [compound-index]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
386 浏览

database - 更新现有数据集上的唯一复合索引

问题:

我正在尝试更新现有数据集上的唯一复合索引,而 Mongo 没有更新索引。

背景:

在我们的网络应用程序的数据库中,我们有一个使用用户的俱乐部 ID 和电子邮件的唯一复合索引。这意味着电子邮件对于用户的俱乐部 ID 而言必须是唯一的。

我正在更新此索引以允许用户共享电子邮件。我们在用户模型上添加了一个名为“primaryAccountHolder”的新属性。我希望新的复合索引允许具有相同 clubID 的用户共享电子邮件,但同一俱乐部中只有一个用户可以将字段 primaryAccountHolder 设置为 true。我有这个索引在本地工作,但我们现有数据集的更新不成功。

我相信这是因为我们的数据库中存在不允许更新该索引的条目。所以我的问题是:如何更新复合索引以保持现有数据集的唯一性?以下是我使用 Mongoose / Typescript 创建的索引。这些在本地工作,但不在我们现有的数据库上工作。

旧索引:

UserSchema.index({ email: 1, clubID: 1 }, { unique: true })

// 不允许同一俱乐部的用户拥有相同的电子邮件。这是我们数据库上的索引。

新索引:

UserSchema.index({ email: 1, clubID: 1 }, { unique: true, partialFilterExpression: { email: { $exists: true }, primaryAccountHolder: { $eq: true } } }

// 将允许用户共享电子邮件,但只有其中一个可以将主要帐户持有人字段设置为 true。

新索引使用部分过滤器表达式。这是未在现有数据集上创建的部分。

谢谢您的帮助!

山姆·格鲁斯

0 投票
1 回答
706 浏览

java - 如何使用 Spring 更新或删除 @CompoundIndex

我现有的@CompoundIndex 定义如下:

现在我需要更改它以添加另一个字段,例如:

我希望它会像在应用程序启动时创建一样自动应用,但在 MongoDb 中它仍然是旧的。我可以用新名称创建一个不同的索引,但是我需要删除这个索引。我可以这样做@ChangeSet吗?有任何想法吗?

0 投票
0 回答
324 浏览

azure-cosmosdb - CosmosDB Mongo API 复合唯一索引是否要求每个字段都是唯一的?

我正在尝试设置一个版本化文档的集合,只要有编辑操作,我就会在其中插入一个具有相同 id 和时间戳的新文档。我在 id 和 timestamp 字段上使用了唯一的复合索引。MongoError: E11000 duplicate key error每当我尝试将具有不同 id 但时间戳相同的文档插入另一个文档时,CosmosDB 都会给我。MongoDB 文档说我应该能够做到这一点:

https://docs.mongodb.com/v3.4/core/index-unique/#unique-compound-index

您还可以对复合索引强制执行唯一约束。如果您在复合索引上使用唯一约束,那么 MongoDB 将强制索引键值组合的唯一性。

我尝试使用非唯一索引,但资源管理器模板失败,说不支持非唯一复合索引。我正在使用 node.js 本机驱动程序v3.2.4。我也尝试使用 Azure Portal 插入文档,但收到了同样的错误。这让我相信 CosmosDB 和 node.js 驱动程序之间没有问题。

这是一个小例子来演示这个问题。我正在使用 Node 运行它v10.15.3

我希望这两个插入操作能够工作并且程序以It works. 我得到的是一个错误:

这是 CosmosDB 的 MongoDB API 中的预期行为还是错误?

0 投票
1 回答
41 浏览

sql-server - T-SQL 复合索引足以查询列的子集?

复合索引是否足以查询列的子集?

0 投票
1 回答
29 浏览

mysql - 您能否解释使用 Composite MySQL INDEX 进行多个 INNER JOIN 的方面?

查询是

对于这部分查询

我有复合索引

通过EXPLAIN我的查询,我看到了 - 其中两个可能是可能的键。但我认为只有ix_aov_p这一点就足够了。

你能解释一下复合索引是如何处理这些情况的吗?我需要两个索引还是只需要一个索引?我需要使用其中的哪一个? ix_aov_p或者ix_p_aov

我研究了类似的问题,但没有足够的解释来理解 - 会发生什么?

复合索引中的单独连接子句- 类似的问题 - 接受的答案没有充分解释发生了什么以及为什么复合索引不起作用。

很高兴解释这些 JOIN 在 INDEX 方面发生了什么,以便理解在这种情况下使用的复合 INDEX。


要使用的 DB 转储表 - DUMP(结构)

表格可视化

0 投票
1 回答
107 浏览

mongodb - 带排序的 MongoDB 复合索引前缀

我很难决定将排序字段放在 mongodb 复合索引中的最佳位置。

我的理解是,我们需要选择最高的基数和选择性作为复合索引中的前面字段

对于这个例子,rating 的范围只有 1 到 5,gender 是 M 或 F 所以,name 总是最高的基数和选择性,应该是复合索引中最左边的字段;但是,查询的用例是在查询中始终提供评分,并且可以通过应用程序中的过滤器选择提供姓名或性别。

哪种选择最适合这种情况:

1)

2)

0 投票
0 回答
22 浏览

mongodb - MongoDb Indexes - Equal vs In 过滤器和索引使用

我有一个用户的以下模型

TenantId 和 containerId 是 1:n 的关系,因此对于一个 Tenant,可能有多个 ContainerId 项。

我读过,为了获得最大的索引使用率,索引中的第一个字段应该是最具选择性的,以尽量减少 MongoDb 需要扫描的文档。更重要的是,一些人建议最好在该字段上使用“平等”过滤器,而不是范围过滤器。现在,我添加了 2 个索引:

现在执行 2 个查询,它们返回的结果相等:

我假设第一个会运行得更快,因为它需要在扫描索引时检查更少的元素。但是,结果似乎几乎相同。有人可以帮我解释一下为什么两个查询的性能相似吗?

第一次查询统计:

第二次查询统计:

0 投票
0 回答
175 浏览

python - 文本搜索未使用创建的文本索引

使用普通索引查询我面临的主要问题是我创建了具有两个权重字段的 $text 索引,并且无法使用该索引进行文本搜索。即使在创建文本索引之后,查询的结果也需要很长时间。

创建文本索引

db Explain Plan 中的文本搜索

正如您在解释计划中看到的那样,“查询使用了以下索引”不适用于此查询(如果正在使用索引,则应该有绿色的勾号,对吧?)。所以我的查询是检查每个文档,而不是使用创建的文本索引。

请帮助解决这个问题。

0 投票
1 回答
135 浏览

mongodb - 在复合文本搜索和时间戳 mongodb 上查询文本搜索索引

我有一个集合,总共有大约6500万条这样的记录

我在 (email, created_int): {"email": text, created_int: -1} 上创建了一个复合索引,用于搜索并过滤 created_int 范围内的哪个名称但我发现它的搜索性能很差。

我尝试在查询中使用解释:

解释结果是:

这是解释统计:

0 投票
1 回答
144 浏览

mongodb - mongoDB:使用索引前缀查询时,按倒排非前缀索引子集排序是否匹配整个索引?

MongoDB 文档

https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-on-multiple-fields

对于使用复合索引进行排序的查询,cursor.sort() 文档中所有键的指定排序方向必须与索引键模式匹配或与索引键模式的逆匹配。例如,索引键模式 { a: 1, b: -1 } 可以支持对 { a: 1, b: -1 } 和 { a: -1, b: 1 } 的排序,但不支持对 { a: - 1, b: -1 } 或 {a: 1, b: 1}。

https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-and-non-prefix-subset-of-an-index

索引可以支持对索引键模式的非前缀子集的排序操作。为此,查询必须在排序键之前的所有前缀键上包含相等条件。

问题

好的,所以给定一个 index {a: 1, b: 1, c: 1, d: 1},第一句话说我可以做 sorts{a: 1, b: 1, c: 1, d: 1}和它的 inverse {a: -1, b: -1, c: -1, d: -1}。惊人的。第二个引用说我可以使用索引来查询索引前缀并按索引“后缀”排序(如果我可以创造那个术语),例如db.Foo.find({a: 52, b: {$lt: 5}, c: {$gte: 12}}).sort({d: 1}). 也很棒。

那么我的问题是,db.Foo.find({a: 52, b: {$lt: 5}, c: {$gte: 12}}).sort({d: -1})(注意降序排列d)会匹配索引{a: 1, b: 1, c: 1, d: 1}吗?它会在幕后反转索引并使用{a: -1, b: -1, c: -1, d: -1}吗?据我所知,mongo 的文档没有涵盖这种情况。