如何在mongodb中为以下查询编制索引?

如何在mongodb中为以下查询编制索引?,mongodb,indexing,Mongodb,Indexing,我正试图找出在mongodb中用于此目的的最佳索引: db.articles.find({"images.url":{"$exists":true}, \ "source_id": {"$in":[ObjectId("511baf3aa56bde8e94000002"), ObjectId("511baf3aa56bde8e94000999")]}}) \ .sort({"published_at": -1}) 我只想包含images.url存在的文章,所以我想知道它是否

我正试图找出在mongodb中用于此目的的最佳索引:

db.articles.find({"images.url":{"$exists":true}, \  
    "source_id": {"$in":[ObjectId("511baf3aa56bde8e94000002"), ObjectId("511baf3aa56bde8e94000999")]}})  \
    .sort({"published_at": -1})
我只想包含images.url存在的文章,所以我想知道它是否是一个稀疏索引?并且不确定要按顺序索引哪些字段,因为我已经阅读了以下不同的指针:

  • 首先是要查询精确值的字段。(“images.url”:存在)
  • 其次是要排序的字段。(:发表于)
  • 最后,您将在其上查询一系列值的字段。(来源编号)
  • 此外,在上面的示例中,我不确定source_id是否是一个值范围

    我在想:

    index "images.url": -1, published_at: -1, source_id: 1, {sparse: true}
    
    但我也对指数的排他性最大化感到困惑,因此我正在考虑:

    index source_id: 1, "images.url": -1, published_at: -1, {sparse: true}
    

    如果我们有这样的收藏

    { a:1, b:1, c:1 }
    { a:1, b:1, c:2 }
    { a:1, b:1, c:3 }
    { a:1, b:2, c:1 }
    ... // all permutations up to:
    { a:3, b:3, c:3 }
    
    想象一下这个集合是按随机顺序排列的

    这就是({a:1,b:1,c:1})上的复合索引的样子

    a:  |        1        |        2        |        3        |
        |-----------------+-----------------+-----------------|                   
    b:  |  1  |  2  |  3  |  1  |  2  |  3  |  1  |  2  |  3  |
        |-----+-----+-----+-----+-----+-----+-----+-----+-----|
    c:  |1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|
    
    每一个a都有它的b和c,好吗

    对于查询:db.xx.find({a:2}).sort({b:1}),您可以看到b元素在a=2下面按顺序排列;该索引将用于对explain()中的“scanander”进行排序:false。如果您的查询是db.xx.find({a:2,c:{$in:[1,3]})。sort({b:1})

    但是这:db.xx.find({a:{$in:[1,3]}).sort({b:1}).explain()将告诉您“scanander”:true,这意味着索引没有用于排序(不过它用于查询)——从上面的模式可以看出,“b”不是a=[1,3]的顺序

    这就是为什么索引的有效顺序是:

    (1) exact matches (only one!)
    (2) sort criteria
    (3) matches that point to more than one document
    
    在你的情况下,没有确切的匹配;两个查询都返回多个文档。让我们在我们的示例中尝试一下:

    db.xx.find({a:{$in:[1,3]},b:{$in:[1,3]})。sort({c:1})。explain():使用索引进行查询,但不用于排序,它扫描15个对象并返回12个对象

    db.xx.find({b:{$in:[1,3]},c:{$in:[1,3]})。sort({a:1})。explain():使用索引进行查询和排序,但扫描21个对象并返回12个对象

    哪一个更好?这将取决于您的用例。如果您的查找通常返回许多文档,那么让排序使用索引可能会更有效-但是如果它通常只返回少数文档(在许多文档中),那么您可能更喜欢更高效的扫描。尝试一下,看看使用explain()有什么更好的方法

    这有用吗

    问候

    罗纳德

    另外,我用它创建了示例集合:

    [1,2,3].forEach(function(a){
        [1,2,3].forEach(function(b){
            [1,2,3].forEach(function(c){
                db.xx.insert({a:a,b:b,c:c});
            })
        })
    })
    

    如果我们有这样的收藏

    { a:1, b:1, c:1 }
    { a:1, b:1, c:2 }
    { a:1, b:1, c:3 }
    { a:1, b:2, c:1 }
    ... // all permutations up to:
    { a:3, b:3, c:3 }
    
    想象一下这个集合是按随机顺序排列的

    这就是({a:1,b:1,c:1})上的复合索引的样子

    a:  |        1        |        2        |        3        |
        |-----------------+-----------------+-----------------|                   
    b:  |  1  |  2  |  3  |  1  |  2  |  3  |  1  |  2  |  3  |
        |-----+-----+-----+-----+-----+-----+-----+-----+-----|
    c:  |1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|
    
    每一个a都有它的b和c,好吗

    对于查询:db.xx.find({a:2}).sort({b:1}),您可以看到b元素在a=2下面按顺序排列;该索引将用于对explain()中的“scanander”进行排序:false。如果您的查询是db.xx.find({a:2,c:{$in:[1,3]})。sort({b:1})

    但是这:db.xx.find({a:{$in:[1,3]}).sort({b:1}).explain()将告诉您“scanander”:true,这意味着索引没有用于排序(不过它用于查询)——从上面的模式可以看出,“b”不是a=[1,3]的顺序

    这就是为什么索引的有效顺序是:

    (1) exact matches (only one!)
    (2) sort criteria
    (3) matches that point to more than one document
    
    在你的情况下,没有确切的匹配;两个查询都返回多个文档。让我们在我们的示例中尝试一下:

    db.xx.find({a:{$in:[1,3]},b:{$in:[1,3]})。sort({c:1})。explain():使用索引进行查询,但不用于排序,它扫描15个对象并返回12个对象

    db.xx.find({b:{$in:[1,3]},c:{$in:[1,3]})。sort({a:1})。explain():使用索引进行查询和排序,但扫描21个对象并返回12个对象

    哪一个更好?这将取决于您的用例。如果您的查找通常返回许多文档,那么让排序使用索引可能会更有效-但是如果它通常只返回少数文档(在许多文档中),那么您可能更喜欢更高效的扫描。尝试一下,看看使用explain()有什么更好的方法

    这有用吗

    问候

    罗纳德

    另外,我用它创建了示例集合:

    [1,2,3].forEach(function(a){
        [1,2,3].forEach(function(b){
            [1,2,3].forEach(function(c){
                db.xx.insert({a:a,b:b,c:c});
            })
        })
    })
    

    一篇有一些视觉效果的好的相关博客文章:。一篇有一些视觉效果的好的相关博客文章:。