MongoDB/Mongoid:搜索与数组中第一项匹配的文档

And*_*rew 2 ruby-on-rails mongodb mongoid mongoid3

我有一个包含数组的文档:

{
    _id: ObjectId("515e10784903724d72000003"),
    association_chain: [
        {
            name: "Product",
            id: ObjectId("4e1e2cdd9a86652647000003")
        }
    ],
    //...
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试在集合中搜索数组中name第一项association_chain与给定值匹配的文档.

我怎么能用Mongoid做到这一点?或者,如果您只知道如何使用MongoDB完成此操作,如果您发布一个示例,那么我可能想知道如何使用Mongoid.

Chr*_*ald 5

使用位置运算符.您可以使用.0(和第二个.1等)查询数组的第一个元素.

> db.items.insert({association_chain: [{name: 'foo'}, {name: 'bar'}]})
> db.items.find({"association_chain.0.name": "foo"})
{ "_id" : ObjectId("516348865862b60b7b85d962"), "association_chain" : [ { "name" : "foo" }, { "name" : "bar" } ] }
Run Code Online (Sandbox Code Playgroud)

您可以看到位置运算符生效,因为在foo第二个元素中搜索不会返回命中...

> db.items.find({"association_chain.1.name": "foo"})
>
Run Code Online (Sandbox Code Playgroud)

......但是寻找bar确实.

> db.items.find({"association_chain.1.name": "bar"})
{ "_id" : ObjectId("516348865862b60b7b85d962"), "association_chain" : [ { "name" : "foo" }, { "name" : "bar" } ] }
Run Code Online (Sandbox Code Playgroud)

您甚至可以索引此特定字段,而无需索引所有关联链文档的所有名称:

> db.items.ensureIndex({"association_chain.0.name": 1})
> db.items.find({"association_chain.0.name": "foo"}).explain()
{
        "cursor" : "BtreeCursor association_chain.0.name_1",
        "nscanned" : 1,
        ...

}
> db.items.find({"association_chain.1.name": "foo"}).explain()
{
        "cursor" : "BasicCursor",
        "nscanned" : 3,
        ...
}
Run Code Online (Sandbox Code Playgroud)