我有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列表。
答案 0 :(得分:2)
你必须考虑的是这种“链接”是如何实际实现的。所以实际上这只是传递的参数的“深度合并”,这就是为什么在这里观察到“联合”行为。
具体来说还有this code,这里也列出了后人:
def where(hash={})
clone.tap { |query| query.criteria.merge!(CriteriaHash.new(hash)) }
end
因此,如果你期望某种“交集”,那么你最好实现自己的方法。这里的行为是“合并”作为其他直接操作的结果可能存在于查询中的任何现有参数。