作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在测试 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。
我是不是做错事了?也许查询设置错误?
最佳答案
您是在运行时检查该查询变量还是您在 MongoDB 日志中看到的内容?
在 C# 驱动程序中,如果检查查询变量,您也会看到 $oid,但这不是发送到服务器的实际查询。在某些时候,它会将其更改为有效的 MongoDB 查询。
如果您在 Linux 上运行,您可能需要启动 mongosniff
,它会在发生时向您显示实时查询、更新和插入。如果您使用的是 Windows,则应使用 -vvvv
标志启动 mongod.exe
,这将使其能够将每个查询、更新、插入或命令记录到日志文件中。
然后您实际上可以看到正在提交的确切查询。
关于java - 意外的 MongoDB "OR"查询行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5272738/
我是一名优秀的程序员,十分优秀!