意外的MongoDB“OR”查询行为

时间:2011-03-11 12:13:15

标签: java mongodb spring-data

我正在测试弹簧数据,这是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。

我是否采取了错误的方式?也许设置查询错了?

1 个答案:

答案 0 :(得分:2)

您是在运行时检查该查询变量还是在MongoDB的日志中看到的那个?

在C#驱动程序中,如果检查查询变量,也会看到$ oid,但这不是发送到服务器的实际查询。在某些时候,它会将其更改为有效的MongoDB查询。

如果您在Linux上运行,您可能需要启动mongosniff,它会在发生时显示实时查询,更新和插入。如果您使用的是Windows,则应使用mongod.exe标志启动-vvvv,这将使其能够将每个查询,更新,插入或命令记录到日志文件中。

然后,您实际上可以看到正在提交的确切查询。