按DBRefs数组查找文档

时间:2011-07-27 15:51:16

标签: mongodb dbref

解决方案可能是盯着我看,但我找不到任何运气。我的问题是我需要找到包含指定DBRef的所有文档。这是要搜索的集合的结构:

{
    "_id" : ObjectId("4e2d4892580fd602eb000003"),
    "date_added" : ISODate("2011-07-25T11:42:26.395Z"),
    "date_updated" : ISODate("2011-07-25T11:43:09.870Z"),
    ...
    "a_list_of_dbrefs" : [
        {
            "$ref" : "somecollection"
            "$id" : "4e2d48ab580fd602eb000004"
        }
    ],
    ...
    "name" : "some name"
}

我需要能够根据a_list_of_dbrefs中出现的DBRef检索一组文档(某些a_list_of_dbrefs可能不包含DBRef,其他可能包含1,其他可能包含1以上)

这是如何完成的?

2 个答案:

答案 0 :(得分:17)

尝试这个,它对我有用:

db.<your collection>.find({"a_list_of_dbrefs.$id": ObjectID("4e2d48ab580fd602eb000004")})

您还可以检索具有ref集合的所有元素:

db.<your collection>.find({"a_list_of_dbrefs.$ref": "somecollection"})

答案 1 :(得分:1)

我建议转储DBRef,转而只是存储引用文档的_id,假设您知道所引用集合的名称。

绝对没有办法在MongoDB上从服务器端“解析”DBRef数组(在一个步骤中),并要求您在客户端上遍历数组并单独解析每个文档。

相反,如果您存储一个仅引用_id的数组,则可以检索该数组,然后使用$in查询来获取它们。

因此,您的文档可能会更改为:

{
    "_id" : ObjectId("4e2d4892580fd602eb000003"),
    "date_added" : ISODate("2011-07-25T11:42:26.395Z"),
    "date_updated" : ISODate("2011-07-25T11:43:09.870Z"),
    ...
    "references": [
        ObjectId(123), ObjectId(234), ObjectId(567), ObjectId(891)
    ],
    ...
    "name" : "some name"
}

然后,您可以使用references字段的内容查询MongoDB:

db.somecollection.find({"_id": {"$in": references}})