当前位置:  开发笔记 > 编程语言 > 正文

在检查$ exists运算符是否存在时,MongoDB可以使用索引吗?

如何解决《在检查$exists运算符是否存在时,MongoDB可以使用索引吗?》经验,为你挑选了3个好方法。

如果我的users收藏中的数据看起来像:

{ name: '...', 
  email: '...', 
  ...,
  photos: {
     123: { url: '...', title: '...', ... },
     456: { url: '...', title: '...', ... },
     ...
  }
} 

我想找到哪个用户拥有照片ID 127,然后我使用查询:

db.users.find( {'photos.127': {'$exists' => true} } );

我试过了,但似乎不可能让MongoDB为这个查询使用索引.我试过的索引是:db.users.ensureIndex({photos:1});.当我使用explain()mongo时告诉我它使用的是BasicCursor(即没有使用索引).

是否可以创建mongo将用于此查询的索引?



1> RameshVel..:

不,没有办法告诉mongodb使用索引进行存在查询.索引与数据完全相关.由于$ exists仅与密钥(字段)相关,因此无法在索引中使用.

$ exists只验证文档中是否存在给定的键(或字段).


没有!!!我测试了mongodb 2.4.3,它使用了索引.请注意,不存在的字段在索引中具有值Null.
MongoDB 3.0.3:`explain`对于`find({field:{$ exists:1}})`和`find({field:{$ ne:null}})`看起来好像会使用索引,但是而第二个查询立即结束,第一个查询卡住了(我猜是全扫描).
`$ exists`现在使用索引(在mongo 3.2上测试)

2> jianpx..:

$ exists不会使用索引,但您可以将数据结构更改为

photos: [
     {id:123, url: '...', title: '...', ... },
     {id:456, url: '...', title: '...', ... },
     ...
  ]

然后使用

db.users.ensureIndex({photos.id:1}) 

为照片ID创建索引.

看来我错了,事实上,你可以强制你的$ exists查询使用你的索引.让我们继续使用上面的结构,但你的照片ID肯定不是包含在内的,也就是说有些文档会有密钥'id'而有些则不会.然后你可以在上面创建稀疏索引:

db.users.ensureIndex({'photos.id': 1}, {'sparse': true})

然后像这样查询:

db.users.find({'photos.id': {$exists: true}}).hint({'photos.id': 1})

您可以添加解释以查看查询是否使用索引.这是我的结果,我的收藏品的移动钥匙与你的照片类似.:

> db.test.count()
50000
> db.test.find({'mobile': {$exists: true}}).hint({'mobile': 1}).explain()
{
        "cursor" : "BtreeCursor mobile_1",
        "nscanned" : 49999,
        "nscannedObjects" : 49999,
        "n" : 49999,
        "millis" : 138,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "isMultiKey" : false,
        "indexOnly" : false,
        "indexBounds" : {
                "mobile" : [
                        [
                                {
                                        "$minElement" : 1
                                },
                                {
                                        "$maxElement" : 1
                                }
                        ]
                ]
        }
}

> db.test.getIndexes()
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "test.test",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "mobile" : 1
                },
                "ns" : "test.test",
                "name" : "mobile_1",
                "sparse" : true,
                "background" : true
        }
]

希望能帮到你!



3> H6...:

由于MongoDB 2.0 $exists查询应该使用索引。不幸的是,此修复程序已在最新版本中消失,并将在MongoDB 2.5中修复

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有