【问题标题】:Perform one Mongoid query instead of two seperate Mongoid queries执行一个 Mongoid 查询而不是两个单独的 Mongoid 查询
【发布时间】:2014-11-07 00:08:29
【问题描述】:

我正在尝试仅使用一个 mongoid 查询来执行以下两个 mongoid 查询。我尝试在 Mongoid 文档中寻找解决方案,但找不到任何解决方案。

查询 1

Event.where(:start_time.gte => current_date.to_s, :start_time.lte => date_after_2_weeks.to_s)

查询 2

Event.where(:stop_time.gte => current_date.to_s, :stop_time.lte => date_after_2_weeks.to_s)

有没有办法只用一个来执行上述两个单独的查询?请帮忙。非常感谢。

谢谢, -帕拉什-

【问题讨论】:

  • 如果您解释了这两个查询的意义,它可能会有所帮助。您想要两个结果集的组合还是“联合”?还是您追求结果的共同点或“交叉点”?
  • 感谢您的回复,尼尔。我想要两个结果集的联合。
  • 然后是“琼斯医生不行”。两个结果集的联合只能通过 两个 查询来实现(最好在您的语言和库支持的情况下并行)。 MongoDB 不执行 SQL 类型的“联合”查询或任何其他形式的“连接”
  • 谢谢尼尔。不知道那个。感谢您的反馈。但是,如果我想要结果的“交集”呢?

标签: ruby-on-rails mongodb mongoid


【解决方案1】:

只要从底层驱动程序中提取,总有“原始”和真正的 Mongo 语法可用。

“联合”基本上是指$or

Event.collection.find({
    "$or" => [
        { "start_time" => { 
            "$gte" => current_date.to_s, 
            "$lte" => date_after_2_weeks.to_s
        },
        { "stop_time" => 
            "$gte" => current_date.to_s,
            "$lte" => date_after_2_weeks.to_s
        }
    ]
})

“交叉点”基本上是指$and

Event.collection.find({
    "start_time" => { 
        "$gte" => current_date.to_s, 
        "$lte" => date_after_2_weeks.to_s
    },
    "stop_time" => {
        "$gte" => current_date.to_s,
        "$lte" => date_after_2_weeks.to_s
    }
})

您可能会发现这是隐含的。所以不需要特定的操作数。毕竟字段名称不同。

也许有一种“railsy”的方式来做到这一点,但特定的语法总是有效的。

【讨论】:

  • 但是通过 Moped(即Event.collection)只会给你一堆哈希,所以它对于查询并不是非常有用。
  • 感谢大家的帮助。 $or 查询完成了这项工作。我按照@kuadrosx 的建议将它与 Event.where() 一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 2012-05-17
  • 2014-05-19
  • 2013-03-11
  • 1970-01-01
相关资源
最近更新 更多