【问题标题】:Mongoid 4 .or not working in complex queryMongoid 4 .or 不能在复杂查询中工作
【发布时间】:2014-03-19 16:49:16
【问题描述】:

我知道 Mongoid 4 仍处于测试阶段,也许我发现了一个错误,但我很难理解为什么第一个查询有效而第二个查询没有返回:

Product.or({sender_uid: params[:user_id]}, {receiver_uid: params[:user_id]})
Product.where({sender_uid: params[:user_id]}).or({receiver_uid: params[:user_id]})

这有点难以编写任何复杂的查询,所以任何指针都会受到赞赏。

【问题讨论】:

    标签: ruby-on-rails-4 mongoid4


    【解决方案1】:

    请看下面的例子:

    Product 1: sender_uid = 1, receiver_uid = 2
    Product 2: sender_uid = 2, receiver_uid = 1
    Product 3: sender_uid = 1, receiver_uid = 2
    
    params[:user_id] = 1
    

    在第一个查询中,您得到的是 ALL sender_uid OR receiver_uid 等于 1 的产品。即产品 1、2 和 3。

    在第二个查询中,您将查询sender_uid1 的所有产品。那是产品 1 和产品 3,然后(根据该标准),receiver_id = 1 的产品。产品 1 和产品 2 都没有带有 uid 1 的接收器。所以,这就是你什么都得不到的原因。您在第二个查询中所做的类似于:

    Product.where(sender_uid: params[:user_id]).where(receiver_uid: params[:user_id])
    

    更新:

    回复评论:

    Product.or({ product_id: 1 }, { product_id: 2, sender_uid: 2 })
    

    如您所见,or 方法接收条件哈希。每一个都像是一个where 查询。

    【讨论】:

    • 这是有道理的。我想我完全误解了 .or 和 .and 方法的作用(即添加一个全新的标准而不是修改现有的标准)。如果是这种情况,如何实现更复杂的查询,如下所示:product_id = 1 OR (product_id = 2 AND sender_uid = 2)?
    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多