【问题标题】:How to match mongoid documents using array fields in query?如何在查询中使用数组字段匹配 mongoid 文档?
【发布时间】:2012-02-22 09:46:06
【问题描述】:

我正在尝试将文档与查询中使用数组字段的 Mongoid/Mongodb 匹配。我一直在努力使用$elemMatch,但似乎无法理解。

上下文

  • Project 可以拥有adminmemberreader 用户
  • Project (HABTM) 引用了这些用户
  • 我希望能够找到以下项目:
    • 用户A是admin
    • 用户 B 是 adminmember
    • ..等等..

示例

给定来自 Rails 控制台的 Project 文档:

[#<Project _id: 4f44355a9f5b7f385a000003, 
  _type: nil, name: "Project ABC", 
  desc: "some description", 
  admin_ids: 
    [BSON::ObjectId('123')], 
  member_ids: 
    [BSON::ObjectId('456'),
    BSON::ObjectId('789')], 
  reader_ids: []
>]

我有以下代码:

@projects = Project.any_of({:admin_ids => [current_user.id]}, 
                           {:member_ids => [current_user.id]}).entries

admin_idsmember_ids 中的current_user.id 匹配只要两个数组中只有一个值。按照上面的代码:

  • 尝试匹配用户 '123' 会得到正确的结果
  • 尝试匹配用户 '456' 没有结果(不正确)

$elemMatch

根据研究,我认为我应该使用$elemMatch,但缺少一些东西。

按照上面的Project文档代码:

// test case: this works with array of one
Project.all(conditions: {:admin_ids => "123"}).entries

// failure case: empty result   
Project.all(conditions: {:member_ids => {'$elemMatch' => {:id => '456' } }}).entries

// failure case: empty result
Project.all(conditions: {:member_ids => {'$elemMatch' => {:id => BSON::ObjectId('4f44a4019f5b7f3d5200000d') } }}).entries

【问题讨论】:

  • 我认为你应该能够使用$in 而不是$elemMatch - 正如mongodocs所说:“你只需要在数组元素中必须匹配多个字段时使用它。”

标签: ruby-on-rails mongodb mongoid


【解决方案1】:

查询时需要去掉数组。

@projects = Project.any_of({:admin_ids => current_user.id}, 
                       {:member_ids => current_user.id}).entries

应该可以的。

【讨论】:

  • 出于某种原因,我必须将 current_user.id 显式转换为带有 to_s 的字符串,才能在范围内工作。
【解决方案2】:

我认为你应该能够使用 $in 而不是 $elemMatch - 正如 mongodocs 所说:

"只有在必须匹配多个字段时才需要使用[$elemMatch] 数组元素。”

您是否尝试过类似以下的方法?

Project.any_in(:member_ids =>  [ member_id_one, member_id_two ])

【讨论】:

  • 感谢您对$elemMatch 的澄清。是的,我需要更像@rubish 的代码。
  • 或者你可以这样做:Project.where(:member_ids.in => [ member_id_one, member_id_two ])
猜你喜欢
  • 1970-01-01
  • 2022-10-31
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 2016-10-02
  • 2015-12-03
  • 1970-01-01
  • 2015-04-23
相关资源
最近更新 更多