2011-03-11 34 views
1

我正在測試spring-data,它是mongodb支持。意外的MongoDB「或」查詢行爲

我對使用or-queries時創建查詢有疑問。考慮以下幾點:

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。

我正在做什麼錯誤的方式?也許設置查詢錯誤?

回答

2

您是在運行時檢查該查詢變量還是您在MongoDB日誌中看到的內容?

在C#驅動程序中,如果您檢查查詢變量,您也會看到$ oid,但這不是發送到服務器的實際查詢。在某些情況下,它會將其更改爲有效的MongoDB查詢。

如果您正在linux上運行,您可能需要啓動mongosniff,它會向您顯示實時查詢,更新和插入。如果您使用的是Windows,則應該使用-vvvv標誌啓動mongod.exe標誌,該標誌將使其能夠記錄每個查詢,更新,插入或命令到日誌文件。

然後,您實際上可以看到正在提交的確切查詢。

+0

謝謝!實際使用了mongosniff和ObjectId。 – eirik 2011-03-13 10:26:07