链接" in"与mongomapper(和plucky)的条款

时间:2014-09-18 13:41:55

标签: ruby mongodb mongomapper

我有mongo的rails应用程序,我通过mongomapper查询。

我想在我的应用程序的不同部分向我的查询添加两个$in子句。例如:

def where_clause1
  where(app_ids: {'$in' => [5, 42, 23]})
end

def where_clause2
  where(app_ids: {'$in' => [44, 5, 87]})
end

我希望这两个条款互相排斥。

但如果我这样做:

$> User.where_clause1
=> #<MongoMapper::Plugins::Querying::DecoratedPluckyQuery 
     app_ids: {"$in"=>[5, 42, 23]}, transformer: ...>
$> User.where_clause2
=> #<MongoMapper::Plugins::Querying::DecoratedPluckyQuery 
     app_ids: {"$in"=>[44, 5, 87]}, transformer: ...>
# so far so good

#But:
$> User.where_clause1.where_clause2
=> #<MongoMapper::Plugins::Querying::DecoratedPluckyQuery 
     app_ids: {"$in"=>[5, 42, 23, 44, 87]}, transformer: ...>

如果我将两个带有$in的where子句链接到内部,则plucky会在app_ids上执行union并合并两个$in子句。我想要一个交叉点,即:[5]

我怎样才能做到这一点?我试过User.where(...).andWhere(...),但那不存在。我不想自己手动交叉两个app_ids列表。

1 个答案:

答案 0 :(得分:2)

你必须考虑的是这种“链接”是如何实际实现的。所以实际上这只是传递的参数的“深度合并”,这就是为什么在这里观察到“联合”行为。

具体来说还有this code,这里也列出了后人:

  def where(hash={})
    clone.tap { |query| query.criteria.merge!(CriteriaHash.new(hash)) }
  end

因此,如果你期望某种“交集”,那么你最好实现自己的方法。这里的行为是“合并”作为其他直接操作的结果可能存在于查询中的任何现有参数。