Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 索引集合仍在扫描所有行以进行简单查找_Mongodb_Mongodb Query - Fatal编程技术网

Mongodb 索引集合仍在扫描所有行以进行简单查找

Mongodb 索引集合仍在扫描所有行以进行简单查找,mongodb,mongodb-query,Mongodb,Mongodb Query,我在一个相当大的mongodb集合中拥有以下文档结构(大约1000万个文档): 问题是,当我在应用程序中查找时,mongodb正在扫描所有可能的行。例如,用户A可能有2800个其他对话,当我执行以下查询只是为了查找与另一个特定用户的对话时,它会扫描所有2800行: db.messages.find({p: ["user A", "user B"]}); 以下是解释输出: { "cursor" : "BtreeCursor p_1 multi", "isMultiKey" : true, "n"

我在一个相当大的mongodb集合中拥有以下文档结构(大约1000万个文档):

问题是,当我在应用程序中查找时,mongodb正在扫描所有可能的行。例如,用户A可能有2800个其他对话,当我执行以下查询只是为了查找与另一个特定用户的对话时,它会扫描所有2800行:

db.messages.find({p: ["user A", "user B"]});
以下是解释输出:

{
"cursor" : "BtreeCursor p_1 multi",
"isMultiKey" : true,
"n" : 0,
"nscannedObjects" : 2805,
"nscanned" : 2806,
"nscannedObjectsAllPlans" : 2805,
"nscannedAllPlans" : 2806,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 23,
"indexBounds" : {
    "p" : [
        [
            "user A",
            "user A"
        ],
        [
            [
                "user A",
                "user B"
            ],
            [
                "user A",
                "user B"
            ]
        ]
    ]
},
"server" : "ip-10-237-195-23:27017"
}
为了可读性,我将用户A和用户B作为实际用户ID字符串的子项


由于有很多这样的查询,这严重影响了性能。我假设我没有正确地为字段编制索引,或者该索引在包含数组的字段上的性能不如预期。无论如何,这里的任何帮助都是非常感谢的。

对于初学者来说,您应该像在
{“p”:{“$all”:[“用户A”,“用户B”]}
中一样使用
[“用户A”,“用户B”]}
中一样使用
$all
,否则您的查询只能将完全格式为
[“用户A”,“用户B”]
的元素与相同顺序的元素相匹配。另外,这些只是数组中的值,还是它们实际上是具有自己属性的对象?我在insert和query上对两个“p”成员进行排序,以确保它们以相同的顺序进行查询。它们只是字符串值,而不是对象。在这种情况下,使用$all还会有帮助吗?
db.messages.find({p: ["user A", "user B"]});
{
"cursor" : "BtreeCursor p_1 multi",
"isMultiKey" : true,
"n" : 0,
"nscannedObjects" : 2805,
"nscanned" : 2806,
"nscannedObjectsAllPlans" : 2805,
"nscannedAllPlans" : 2806,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 23,
"indexBounds" : {
    "p" : [
        [
            "user A",
            "user A"
        ],
        [
            [
                "user A",
                "user B"
            ],
            [
                "user A",
                "user B"
            ]
        ]
    ]
},
"server" : "ip-10-237-195-23:27017"
}