Я использую Python 3.7.1 (по умолчанию, 14 декабря 2018, 19:28:38) и pymongo 3.7.2.
В mongodb это работает:
db.collection.find(
{$and:[
{"field":{$regex:"bon?"}},
{"field":{$not:{$regex:"bon souple"}}},
{"field":{$not:{$regex:"bon léger"}}}
]}
)
Такв пимонго я сделал так же, как:
db.collection.find(
{"$and":[
{"field":{"$regex":"bon?"}},
{"field":{"$not":{"$regex":"bon souple"}}},
{"field":{"$not":{"$regex":"bon léger"}}}
]}
)
, но это указывает pymongo.errors.OperationFailure: $regex has to be a string
.
Так что я попробовал это, как предложено здесь :
liste_reg=[
{'field': {'$regex': {'$not': re.compile('bon souple')}}},
{'field': {'$regex': {'$not': re.compile('bon léger')}}},
{'field': {'$regex': re.compile('bon?')}}
]
rslt=list(
db.collection.find({"$and":liste_reg})
)
Я заметил, что даже когда нет специального символа, он указывает на ту же ошибку:
liste_reg=[
{'field': {'$regex': {'$not': re.compile('bon souple')}}} #where no special char is present
]
rslt=list(
db.collection.find({"$and":liste_reg})
)
Поэтому я попытался использовать "/"
как:
liste_reg=[
{'field': {'$regex': {'$not':'/bon souple/'}}} #where no special char is present
#even tried re.compile('/bon souple/')
]
rslt=list(
db.collection.find({"$and":liste_reg})
)
та же ошибкаpymongo.errors.OperationFailure: $regex has to be a string
все еще происходит.
Что я могу сделать?
НЕКОТОРЫЕ ОБНОВЛЕНИЯ МОЕГО ИССЛЕДОВАНИЯ РЕШЕНИЯ
ядро проблемы, кажется, с $not
, потому что когдаЯ делаю:
liste_reg=[{'field': {'$regex': 'bon?'}}]
rslt=list(
db.collection.find({"$and":liste_reg})
)
len(rslt)#gives 23 013, what is ok.
Нет ошибки.
НЕКОТОРЫЕ ОБРАЗЦЫ
По просьбе Эммы я могу дать образец, и он откроет мой запрос на монго.Обычно я должен иметь следующие условия в поле:
- сек
- très léger
- léger
- bon léger
- bon
- сладкий суп
- суп
- суп суп
- коллан
- тыква
- тыква
- profond
Основная проблема для меня заключается в том, что мой паук неправильно проанализировал, потому что я не написал для этого достаточно сильный скрипт.Вместо того, чтобы получать просто «bon», я получаю такой результат:
{"_id":"ID1",
"field":"bon\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\tnon",
...}
, и это пример между многими другими неправильными разборками.Вот почему я хочу, чтобы результат начинался с "bon?"
, но не с "bon souple"
или "bon léger"
, потому что они имеют правильные значения, а не \n
или \t
.
Так как образцы:
[{"_id":"ID1",
"field":"bon\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\tnon"},
{"_id":"ID2",
"field":"bon\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tpremière"},
{"_id":"ID3",
"field":"bon\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t2ème"},
{"_id":"ID4",
"field":"bon souple"},
{"_id":"ID5",
"field":"bon léger"}]