当前位置: 首页 > 知识库问答 >
问题:

MongoDB:查询多个字段和索引

柳业
2023-03-14

我正在通过猫鼬使用MongoDB。

>

// For example
MyModel.find({ _id: '123', name: 'Jina'});

MongoDB是执行集合扫描还是索引有助于提高查询效率?查询是否与仅使用id字段有任何不同?

如果MongoDB在您查询非索引字段时进行集合扫描。如果集合扫描完全相同,查询多个非索引字段是否会加快查询速度?假设我查询五个非索引字段而不是两个(都返回相同的文档)。两个查询是否都进行相同的集合扫描?

共有1个答案

屠昌胤
2023-03-14

要了解mongo查询中隐藏的情况,您可以使用解释。例如,考虑以下查询:db.getCollection('user'). search({"name":"ana"}),它查询非索引字段。您可以对此查询使用解释如下:

<代码>分贝。getCollection(“用户”)。查找({“name”:“ana”})。解释(“executionStats”)

部分结果是:

"queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "anonymous-chat.users",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "name" : {
                "$eq" : "ana"
            }
        },
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "name" : {
                    "$eq" : "ana"
                }
            },
            "direction" : "forward"
        },
        "rejectedPlans" : []
    },

正如您所看到的,这里有一个COLLSCAN,这是一个集合扫描。现在我们只需查询\u id并查看结果:

db.getCollection('users').find({"_id":ObjectId("5ee9b6c125b9a9a426d9965f")}).explain("executionStats")

结果如下:

"queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "anonymous-chat.users",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "_id" : {
                "$eq" : ObjectId("5ee9b6c125b9a9a426d9965f")
            }
        },
        "winningPlan" : {
            "stage" : "IDHACK"
        },
        "rejectedPlans" : []
    },

正如我们所看到的,当只查询id时,我们有IDHACK。

现在我们结合_id和名称:

db.getCollection('users').find({"_id":ObjectId("5ee9b6c125b9a9a426d9965f"), "name":"ana"}).explain("executionStats")

这就是结果:

 "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "anonymous-chat.users",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : [ 
                {
                    "_id" : {
                        "$eq" : ObjectId("5ee9b6c125b9a9a426d9965f")
                    }
                }, 
                {
                    "name" : {
                        "$eq" : "ana"
                    }
                }
            ]
        },
        "winningPlan" : {
            "stage" : "FETCH",
            "filter" : {
                "name" : {
                    "$eq" : "ana"
                }
            },
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "_id" : 1
                },
                "indexName" : "_id_",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "_id" : []
                },
                "isUnique" : true,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "_id" : [ 
                        "[ObjectId('5ee9b6c125b9a9a426d9965f'), ObjectId('5ee9b6c125b9a9a426d9965f')]"
                    ]
                }
            }
        },
        "rejectedPlans" : []
    },

如我们所见,索引有助于提高查询性能,因为我们有两个阶段,一个IXSCAN(Index Scan)和一个FETCH阶段,用于过滤最后阶段的文档。

现在让我们查询多个非索引字段以了解您的第二个问题:

db.get集合('用户'). search({"name":"ana","appId": 1}).解释("执行统计")

"queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "anonymous-chat.users",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : [ 
                {
                    "appId" : {
                        "$eq" : 1.0
                    }
                }, 
                {
                    "name" : {
                        "$eq" : "ana"
                    }
                }
            ]
        },
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "$and" : [ 
                    {
                        "appId" : {
                            "$eq" : 1.0
                        }
                    }, 
                    {
                        "name" : {
                            "$eq" : "ana"
                        }
                    }
                ]
            },
            "direction" : "forward"
        },
        "rejectedPlans" : []
    },

如上所述,多个字段只有一次集合扫描。

 类似资料:
  • 我有一个endpoint,我正在将它代理到ElasticSearchAPI中,以进行简单的用户搜索。 有关这些参数的一些详细信息如下 所有参数都是可选的 昵称可以作为全文搜索进行搜索(即'myUser'将返回'myUsername') 电子邮件必须完全匹配 名称可以搜索为每个令牌的全文搜索(即'john'将返回'John Smith') ElasticSearch调用应将参数集体视为AND'd。

  • 问题内容: 我有要查询的模型(称为“活动”)(使用Mongoose)。他们的架构如下所示: 当我询问他们,我填充,,,和字段(所有引用)。在那之后,我也深入了这个领域。这是我的查询代码: 这已经是一个相对复杂的查询,但是我需要做更多。如果它碰到了声明的一部分,我 还 需要确保的字段等于字符串。我尝试使用,但是由于必须先填充事件,因此无法查询其任何字段。我还需要在其他多个查询中实现相同的目标。 如我

  • 我需要在我的应用程序中添加搜索栏。搜索将按名和姓进行搜索。我不知道如何编写elastcsearch查询。名字和姓氏是两个分开的字段。我是个新手。 例:名:约翰,姓:约书亚 搜索栏字符串为上层结果:约翰·乔·约翰·乔·约翰·乔·乔·约翰·约书亚·约翰·约书亚·乔...

  • 我在谷歌周围看了一段时间,但没有工作。有谁能帮我解决这个问题吗?

  • 我配置了一个带有两个字段的Elasticsearch索引:“name”和“type”。当我执行下面的查询时,没有得到任何结果,因为“actor”在“type”字段中。 有没有任何方法可以执行一个包含多个单词的查询,并且即使一些单词在“name”字段中而其他单词在“type”字段中也可以得到结果。 谢谢你的帮助!

  • 问题内容: 我正在使用node-mongodb-native驱动程序(http://mongodb.github.io/node-mongodb- native/ )使用nodejs 。 我有带有日期属性存储为类型的文档。 通过nodejs,我正在使用以下查询: 它什么也不返回。为了使其正常工作,我需要执行以下操作: 但是在我的nodejs代码中无法识别。 那么,如何通过我的nodejs程序对mo