【问题标题】:Unexpected MongoDB "OR" query behaviour意外的 MongoDB“或”查询行为
【发布时间】:2011-03-11 12:13:14
【问题描述】:

我正在测试 spring-data,它是 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。

我做错事了吗?也许设置查询错误?

【问题讨论】:

    标签: java mongodb spring-data


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!使用了mongosniff,实际使用了ObjectId。
    猜你喜欢
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多