Ruby on rails 如何在查询中使用数组字段匹配mongoid文档?
我正在尝试将文档与查询中使用数组字段的Mongoid/Mongodb进行匹配。我一直在努力使用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",
$elemMatch
,但似乎无法获得它
上下文
可以有项目
,管理员
,成员
用户阅读器
- 这些用户由
(HABTM)引用项目
- 我希望能够找到以下项目:
- 用户A是管理员
- 用户B是
或管理员
成员
- 。。等等
项目
文档:
[#<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
,但我遗漏了一些东西。
根据上述项目
文件代码:
// 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
的字符串,这样才能在作用域中工作。