我正在尝试将文档与Mongoid / Mongodb匹配,其中在查询中使用了数组字段。我一直在与$elemMatch
挣扎,但似乎无法得到它。
Project
可以有admin
,member
,reader
个用户Project
(HABTM)admin
admin
或member
给出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.id
和admin_ids
之间匹配member_ids
,只要在任一数组中只有一个值。根据上面的代码:
'123'
会给出正确的结果'456'
没有结果(不正确) 基于研究,我认为我应该使用$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
答案 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 ])