如何在查询中使用数组字段匹配mongoid文档?

时间:2012-02-22 09:46:07

标签: ruby-on-rails mongodb mongoid

我正在尝试将文档与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

current_user.idadmin_ids 之间匹配member_ids,只要在任一数组中只有一个值。根据上面的代码:

  • 尝试匹配用户'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

2 个答案:

答案 0 :(得分:10)

查询时需要摆脱阵列。

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

这应该有效。

答案 1 :(得分:9)

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

  

“当必须匹配多个字段时,您只需要使用[$elemMatch]   数组元素。“

您是否尝试过以下内容?

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