关于索引的创建需要明确以下几点
{"field1":1,"排序字段":1}
局部索引是仅为信息子集维护的索引。例如,假设我们有一个推文数据库,并且正在从我们的账户中查找转发次数最多的推文
import pymongo
import random
import string
from pymongo.collation import Collation
random.seed(10)
letters = string.ascii_lowercase
upper = string.ascii_uppercase
class MongoDBServer():
def __init__(self,database,collation) -> None:
self.client = pymongo.MongoClient('mongodb://ellis:[email protected]:32000/')
self.database = self.client[database]
self.colleceion = self.database[collation]
def insert_many(self,documents):
self.colleceion.insert_many(documents)
server = MongoDBServer("partial","partial")
value=[{"username":"ellis","text":"一部好戏","retweet_count":0},
{"username":"v","text":"一部好戏","retweet_count":1},
]
server.insert_many(value)
# server.colleceion.create_index([("username", 1),("retweet_count",1)], partialFilterExpression = {"retweet_count": {"$gt":0}}, background = True)
print(server.colleceion.find({"username":"ellis"}).sort([('retweet_count',1)]).explain())
我们可以看到这个查询并没有使用索引。为了使用索引我们可以在username以及retweet_count上创建索引,这虽然可以解决问题。但这将是一个非常大的索引。由于大部分的推文并没有被转发,因此我们可以只在那些被转发的推文上创建一个局部索引。
server.colleceion.create_index([("username", 1),("retweet_count",1)], partialFilterExpression = {"retweet_count": {"$gt":0}}, background = True)
当我们查找从未被转发的推文的时候,该索引将无济于事。
请注意为了利用这个索引,我们需要在查询时指定一个过滤条件。以确保MongoDB知道我们需要的所有数据都在索引中。
import pymongo
import random
import string
from pymongo.collation import Collation
random.seed(10)
letters = string.ascii_lowercase
upper = string.ascii_uppercase
class MongoDBServer():
def __init__(self,database,collation) -> None:
self.client = pymongo.MongoClient('mongodb://ellis:[email protected]:32000/')
self.database = self.client[database]
self.colleceion = self.database[collation]
def insert_many(self,documents):
self.colleceion.insert_many(documents)
server = MongoDBServer("partial","partial")
# value=[{"username":"ellis","text":"一部好戏","retweet_count":0},
# {"username":"vv","text":"一部好戏","retweet_count":1},
# ]
# server.insert_many(value)
server.colleceion.create_index([("username", 1),("retweet_count",1)], partialFilterExpression = {"retweet_count": {"$gt":0}}, background = True)
print(server.colleceion.find({"username":"ellis","retweet_count":{"$gt":0}}).sort([('retweet_count',1)]).explain())