【发布时间】:2012-02-22 09:46:06
【问题描述】:
我正在尝试将文档与查询中使用数组字段的 Mongoid/Mongodb 匹配。我一直在努力使用$elemMatch,但似乎无法理解。
上下文
-
Project可以拥有admin、member、reader用户 -
Project(HABTM) 引用了这些用户 - 我希望能够找到以下项目:
- 用户A是
admin - 用户 B 是
admin或member - ..等等..
- 用户A是
示例
给定来自 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_ids 和member_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