Pymongo: поиск, диктовка ИЛИ операция - PullRequest
3 голосов
/ 14 января 2012

Я использую приведенный ниже код, пытаясь получить все записи о том, что поле "user_name" ИЛИ поле "text" содержит указанное ключевое слово, похоже, что pymongo рассматривает операцию как AND, как указать pymongo для обработки это операция "ИЛИ"?

search_dict = {}

text_regex = ".*" + key + ".*";
text_reg = re.compile(text_regex,re.IGNORECASE)
search_dict["text"] = text_reg

user_name_regex = ".*" + key + ".*";
user_name_reg = re.compile(user_name_regex,re.IGNORECASE)
search_dict["user_name"] = user_name_reg

records = gLife_Article_Collection.find(search_dict)

Ответы [ 2 ]

4 голосов
/ 17 января 2012

@ qiao правильный, синтаксис $or правильный, вот полный пример:

import re
from pymongo import Connection
connection = Connection()
db = connection.test_database
db.regex_test.drop()

# Create some sample docs
db.regex_test.save({"user_name": "Rozza", "text": "Writing an example for Bin Chen based on qiao's answer"})
db.regex_test.save({"user_name": "qiao", "text": "Answering Bin Chen's question"})
db.regex_test.save({"user_name": "Bin Chen", "text": "Reading rozza's answer"})

# Do a regex $or query simple example
search_dict = {"$or": [
    {"user_name": {"$regex": "^Rozza"}}, 
    {"text": {"$regex": "rozza"}}
]}
assert db.regex_test.find(search_dict).count() == 2

# Do a regex $or query with re.compile
search_dict = {"$or": [
    {"user_name": re.compile("*.Rozza.*", re.IGNORECASE)}, 
    {"text": re.compile("*.Rozza.*", re.IGNORECASE)}
]}
assert db.regex_test.find(search_dict).count() == 2
1 голос
/ 14 января 2012

Специальный ключ $or позволит вам делать логические комбинации, см. Официальный документ MongoDB: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

search_dict = {'$or': [{'text': text_reg}, {'user_name': user_name_reg}]}
records = gLife_Article_Collections.find(search_dict)
...