Неожиданное поведение запроса MongoDB «ИЛИ» - PullRequest
1 голос
/ 11 марта 2011

Я тестирую данные Spring и их поддержку mongodb.

У меня есть вопрос о создании запроса при использовании or-запросов.Рассмотрим следующее:

Query query = new Query().or(new Query(where("receiverId").is(userId)), new Query(where("requesterId").is(userId)));
query.and(where("status").is(status));

Это приведет к следующему запросу mongodb:

 "$or" : [ { "receiverId" : { "$oid" : "4d78696025d0d46b42d9c579"}} , { "requesterId" : { "$oid" : "4d78696025d0d46b42d9c579"}}] , "status" : "REQUESTED"}

Возвращает ноль результатов, пока ожидается один.Выполнение этого запроса в команде mongodb приводит к следующей ошибке:

error: { "$err" : "invalid operator: $oid", "code" : 10068 }

Изменение запроса и выполнение его в команде mongodb работает нормально:

{ "$or" : [ { "receiverId" : ObjectId("4d78696025d0d46b42d9c579")} , { "requesterId" : ObjectId("4d78696025d0d46b42d9c579")}] , "status" : "REQUESTED"}

Обратите внимание на использование ObjectId ("... ") вместо $ oid.

Я что-то не так делаю?Может быть, неправильная настройка запроса?

1 Ответ

2 голосов
/ 11 марта 2011

Проверяете ли вы эту переменную запроса во время выполнения или это то, что вы видите в журналах MongoDB?

В драйвере C #, если вы проверяете переменную запроса, вы также видите $ oid, но этоне фактический запрос, который отправляется на сервер.В какой-то момент это меняет его на действительный запрос MongoDB.

Если вы работаете в Linux, вы можете захотеть запустить mongosniff, который покажет вам запросы, обновления и вставки в реальном времени по мере их возникновения.Если вы работаете в Windows, вы должны запустить mongod.exe с флагом -vvvv, который позволит ему регистрировать каждый запрос, обновление, вставку или команду в файл журнала.

Тогда вы действительно сможете увидеть точный отправляемый запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...