2011-03-11 35 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