【发布时间】:2021-09-19 15:17:40
【问题描述】:
我有一组复杂的文档。
{
<some fields>,
meta_info: {
company_name: String,
invalid: Boolean,
mobile_layout: String,
<more fields>
}
<lots more fields>
}
我让 Rails 使用 meta_info.invalid 为 true/false/nil 找到所有那些文档
finished_acts.where('meta_info.invalid' => true/false/nil)
现在有一个文档,其中该字段不存在。请问……
finished_acts.find('meta_info.invalid' => {'$exists' => false})
=> nil
这完全是不真实的(另外,如果我问{'$exists' => true},它也会产生 nil),也是如此
finished_acts.where('meta_info.invalid' => {'$exists' => false}).count
=> 0
我怎样才能找到这份文件?我花了几天时间收集统计数据,与数据库本身提供的信息相比,这些数据总是相差一个计数,原因是这个不存在的字段。
我正在使用 mongoDB V3.4.17 和 Mongoid 6.1.0。
编辑:后来我了解到我错误地使用了.find 命令,它仅用于_id 字段并且不接受JSON/哈希。
我的问题显然显示了 Mongoid 的 Active Record 适配的实现中的一个错误,我正在慢慢地将我的代码转换为始终使用聚合。这样做时,我得到了正确数量的文档。当然,聚合返回的结构处理起来更复杂,因为它只有哈希和数组,但如果这是为了获得正确结果而进行的权衡,我很满意。
【问题讨论】:
-
$exists: false适用于嵌套字段:mongoplayground.net/p/be8sVcdQU8g。 ruby/mongoid 不应该搞砸了,但还是尝试使用 mongodb cli 进行查询 -
顺便说一句,我知道我可以通过聚合来做到这一点,但这会产生一组难以操作的文档。我想使用 Mongoid 提供的模型。
-
@SergioTulentsev 抱歉,我知道如何使用 mongo。我想知道如何使用 Mongoid。我有一个 Rails 程序,它需要找到正确的结果集。
-
那么,让我们看看 mongoid 生成的查询。我很好奇,会有什么不同。
标签: ruby-on-rails mongoid