Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在查询中使用数组字段匹配mongoid文档?_Ruby On Rails_Mongodb_Mongoid - Fatal编程技术网

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

Ruby on rails 如何在查询中使用数组字段匹配mongoid文档?,ruby-on-rails,mongodb,mongoid,Ruby On Rails,Mongodb,Mongoid,我正在尝试将文档与查询中使用数组字段的Mongoid/Mongodb进行匹配。我一直在努力使用$elemMatch,但似乎无法获得它 上下文 项目可以有管理员,成员,阅读器用户 这些用户由项目(HABTM)引用 我希望能够找到以下项目: 用户A是管理员 用户B是管理员或成员 。。等等 例子 给定Rails控制台中的项目文档: [#<Project _id: 4f44355a9f5b7f385a000003, _type: nil, name: "Project ABC",

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

上下文
  • 项目
    可以有
    管理员
    成员
    阅读器
    用户
  • 这些用户由
    项目
    (HABTM)引用
  • 我希望能够找到以下项目:
    • 用户A是管理员
    • 用户B是
      管理员
      成员
    • 。。等等
例子 给定Rails控制台中的
项目
文档:

[#<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: []
>]
只要两个数组中只有一个值,它就可以跨
管理员id
成员id
匹配
当前用户.id
。根据上述代码:

// 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
  • 尝试匹配用户
    '123'
    会给出正确的结果
  • 尝试匹配用户
    '456'
    不会给出任何结果(不正确)
$elemMatch 基于调查,我认为我应该使用
$elemMatch
,但我遗漏了一些东西。

根据上述
项目
文件代码:

// 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,正如所说:

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

你有没有试过下面的方法

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

您需要在查询时除去数组

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

这应该是可行的。

我认为您应该能够使用
$in
而不是
$elemMatch
——正如mongodocs所说:“只有在数组元素中必须匹配多个字段时才需要使用它。”感谢您对
$elemMatch
的解释。是的,我需要一些更像@rubish的代码。或者你可以做:Project.where(:member\u id.in=>[member\u id\u one,member\u id\u two])出于某种原因,我必须显式地将
当前用户.id
转换为一个带有
to\s
的字符串,这样才能在作用域中工作。