【问题标题】:mongo_mapper query returns no results, direct query in DB returns resultsmongo_mapper 查询不返回结果,直接在 DB 中查询返回结果
【发布时间】:2013-10-08 04:06:50
【问题描述】:

设置如下:

宝石文件:

gem 'mongo_mapper', '>= 0.13.0.beta1'
gem 'plucky', '>= 0.6.5'

控制器:

@job = Job.where(:admin_id => a.id)

Rails 控制台输出(记录器):

@job is []

一个“a.id”值恰好是:

a.id is 51ddbd6b972791243d0000f1

Mongo 直接查询:

db.jobs.find({ admin_id: "51ddbd6b972791243d0000f1" })

>>>Lots of stuff<<<

有多少?

> db.jobs.find({ admin_id: "51ddbd6b972791243d0000f1" }).count()
202

那么 - 为什么这个查询在 Mongo 中直接完成时返回结果,而从控制器调用时返回一个空数组?

更具体地说 - 这是简单的循环:

@tech_d = []
    @tech.each do |a|
      Rails.logger.info("a.id is " + a.id)
      @job = Job.where(:admin_id => a.id)
      Rails.logger.info("@job is " + @job.to_a.to_s)

产生这样的东西:

a.id is 51ddbd6b972791243d0000f1
@job is []
a.id is 51f976f2811d830002000adc
@job is []

但正如我已经证明的那样 - 在 Mongo 中直接完成这个简单的查询会有结果。

**EDIT - 我已经尝试了 mongo_mapper gem 0.12.0 的 GA 版本,结果是相同的(将 plucky 降级为 0.5.2 以匹配 - 没有变化)

【问题讨论】:

    标签: ruby-on-rails mongodb gem mongomapper


    【解决方案1】:

    您没有得到任何结果,因为当您使用它时,它只会创建查询。

    您需要通过附加 .all 来“执行”它

    @job = Job.where(:admin_id => a.id)
    

    会还给你:

    => #<Plucky::Query admin_id: "51ddbd6b972791243d0000f1", transformer: #<Proc:0x00000003d5c2a0@/var/lib/gems/1.9.1/gems/mongo_mapper-0.12.0/lib/mongo_mapper/plugins/querying.rb:76 (lambda)>>
    

    你应该这样做:

    @job = Job.where(:admin_id => a.id).all
    
    or simply
    
    @job = Job.all(:admin_id => a.id)
    

    从这里查看下一段:http://mongomapper.com/documentation/plugins/querying.html#criteria

    Mongo 对动态查询有丰富的支持。 MongoMapper 使用 Plucky 构造查询代理对象,仅在以下情况下从 Mongo 检索数据 需要。这允许查询由多个条件组成 在被评估之前。

    【讨论】:

    • 不——抱歉——这不是答案。我已经尝试过 Job.where(query)、Job.all(query)、Job.where({query})、Job.all({query}),甚至对 Job.find 感到疯狂(当然不是mongo_mapper 函数)。我已经使用 Mongo 和 Plucky 有一段时间了,我在我的应用程序中执行了许多类似这样的查询。特别是这个有点奇怪。
    【解决方案2】:

    朝我的脸开枪,结果竟然是把它串起来了……

    a.id.to_s 代替 a.id 在查询中。

    真是太牛了。我可以 Rails.logger.info(a.id) 并得到正确的输出 - 没有 to_s 方法 - 但我必须 to_s 将它放入查询中......

    天啊,这太明显了,让我很痛苦。

    【讨论】:

    • Logging 对传递给它的数据隐式调用 to_s。看起来问题在于您在数据库中存储字符串 ID 而不是 BSON ID - 通常建议不要这样做。
    • 克里斯 - 我很欣赏评论,根据我的经验,日志记录语句不会隐式调用数据上的 to_s。很多很多次,我刷新页面只是为了看到“没有将 X 隐式转换为字符串”,我总是不得不返回并在 var 上添加 to_s。这发生在 Date 对象、Time 对象、Mongo plucky 查询、JSON、任何 Integer / Array 中。从字面上看,一切都需要我手动添加 to_s 以使其显示在记录器中。请教我如何告诉 Logger 隐式添加 to_s - 这对我有很大帮助。
    • 抱歉,我相信它调用的是#inspect,而不是#to_s。请参阅gist.github.com/cheald/dd95008667ff5992fb44 - 我相信问题在于您在 DB 中有字符串 ID 而不是 BSON ID;它们是单独的类型,并被视为单独的类型。
    猜你喜欢
    • 2015-08-04
    • 2013-10-01
    • 1970-01-01
    • 2021-07-31
    • 2019-09-18
    • 2012-05-08
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多