我发现很难理解mongodb中的多键索引是如何实现的.

以下是我在mongodb网站上读到的关于mongodb文档中多键的内容:

那么,该文档的索引项究竟意味着什么呢?每个文档都记得条目吗?在这种情况下,搜索将是一次完整的表格扫描?或者是mysql的同一个b树索引,每个索引项都会针对每个事件指向多个文档,在这种情况下,我想得太多了.

让我们举个例子:

obj1 = { 
    name: "Apollo",
    text: "Some text about Apollo moon landings",
    tags: [ "moon", "apollo", "spaceflight", "nasa" ]
}
obj2 = { 
    name: "Atlantis",
    text: "Some text about Atlantis flight missions",
    tags: [ "space", "atlantis", "spaceflight", "nasa" ]
}
db.articles.ensureIndex( { tags : 1 } )

请帮我理解!提前谢谢.

推荐答案

在本例中,您的索引(即B-树)将如下所示:

 apollo => [ obj1 ]
 atlantis => [ obj2 ]
 moon => [ obj1 ]
 nasa  => [ obj1, obj2 ]
 space => [ obj2 ]
 spaceflight => [ obj1, obj2 ]

这只是一个"常规"B树索引,只是每个文档可以出现多次(每个唯一的标记值都会出现一次).

Mongodb相关问答推荐

如何限制/筛选子文档中的条目?

MongoDB$unionWith,如何 Select 特定文档

在出现错误时忽略mongodb事务回滚是好做法吗

如何在MongoDB中通过限制和跳过查找项进行匹配

将消息流式传输到WebSocket

除非满足某个条件,否则Mongo是否按日期排序?

为什么数组长度0被认为是Mongoose中排序中最大的数字

Mongoose 排除数组中包含特定嵌套对象的文档

Mongoose 查询以获取内部数组和该内部数组中的特定元素

Mongoose 聚合和多级组

找到一个用户,然后使用 MongoDB 根据他们的总分获得他们的排名

mongoDB 过滤、排序和排名结果

使用 nodejs/mongoose 部分更新子文档

如何解决 ClassNotFoundException:com.mongodb.connection.BufferProvider?

MongoDB - 我如何找到另一个集合中的文档未引用的所有文档

如何在 MongoDB 的 $match 中使用聚合运算符(例如 $year 或 $dayOfMonth)?

判断 mongoDB 是否连接

如何从 Mongoose 模型对象中获取集合名称

Mongodb $lookup 使用 _id 无效果

如何在 MongoDB 中删除此弃用警告,为什么会这样?