我正在尝试使用PyMongo构建一个Python脚本,该脚本将能够命中一个Mongo数据库,该数据库可以获得数据库中可能存在的n个对象的精确匹配。目前,我有这个设置:
# This function adds two numbers
def add(x, y):
return x + y
# This function subtracts two numbers
def subtract(x, y):
return x - y
# This function multiplies two numbers
def multiply(x, y):
return x * y
# This function divides two numbers
def divide(x, y):
return x / y
print("Select operation.")
print("1.Add")
print("2.Subtract")
print("3.Multiply")
print("4.Divide")
# Take input from the user
choice = input("Enter choice(1/2/3/4):")
num1 = int(input("Enter first number: "))
num2 = int(input("Enter second number: "))
if choice == '1':
print(num1,"+",num2,"=", add(num1,num2))
elif choice == '2':
print(num1,"-",num2,"=", subtract(num1,num2))
elif choice == '3':
print(num1,"*",num2,"=", multiply(num1,num2))
elif choice == '4':
print(num1,"/",num2,"=", divide(num1,num2))
else:
print("Invalid input")
对象列表如下所示:
db.entries.find({'$or': [<list-of-objects]})
当我在列表中有10个左右的项目时,使用[{'email': 'some@email.com', 'zip': '11111'}, {'email': 'another@email.com', 'zip': '11112'}, ...]
可以正常工作。我现在用100测试,需要很长时间才能返回。我考虑过使用多个$or
过滤器,但我不知道这是否是最佳选择。
我确定有更好的方法可以解决这个问题,但我对Mongo来说还是个新手。
编辑:下面$in
的输出:
.explain()
答案 0 :(得分:1)
我建议您创建一个新索引(复合索引),就像您使用两个字段进行搜索一样:
db.entries.createIndex( {"email": 1, "zip": 1} )
现在运行您的查询,在查询中附加explain()命令,您应该看到它已经开始使用IXSCAN而不是COLLSCAN。
答案 1 :(得分:0)
为了避免索引和重新索引(此查询不仅仅与电子邮件/ zip有关,也是动态的),我使用每个标头构建数据列表并将它们用作$in
参数,然后传递这些进入$and
。它似乎工作得很好,并且查询的时间不超过3分钟。
示例:
{'$and': [{'email': {'$in': ['some@example.com', 'fake@example.com', 'email@example.com']}, 'zipcode': {'$in': ['12345', '11111', '11112']}}]}