MongoDB与多个文档字段完全匹配

时间:2017-08-04 19:19:00

标签: mongodb pymongo

我正在尝试使用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()

2 个答案:

答案 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']}}]}