Поиск документов по массиву DBRef - PullRequest
8 голосов
/ 27 июля 2011

Решение, вероятно, смотрит мне в глаза, но мне не повезло найти его. Моя проблема заключается в том, что мне нужно найти все документы, которые содержат указанный 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"
}

Мне нужно иметь возможность получать набор документов на основе DBRef, отображаемого в a_list_of_dbrefs (некоторые a_list_of_dbrefs могут не содержать DBRef, другие могут содержать 1, а другие могут содержать более 1).

Как это сделать?

Ответы [ 2 ]

17 голосов
/ 30 марта 2013

Попробуйте это, у меня это сработало:

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

Вы также можете получить все элементы, имеющие ссылку на коллекцию:

db.<your collection>.find({"a_list_of_dbrefs.$ref": "somecollection"})
1 голос
/ 27 июля 2011

Я бы рекомендовал сбросить DBRef s в пользу простого хранения _id документа, на который есть ссылка, при условии, что вы знаете имя коллекции, на которую ссылается.

Нет абсолютно никакого способа "разрешить "массив DBRef со стороны сервера (за один шаг) на MongoDB и требует, чтобы вы перебирали массив на клиенте и индивидуально разрешали каждый документ.

И наоборот, если вы хранитемассив только из упомянутых _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"
}

Затем вы можете запросить MongoDB, используя содержимое поля references:

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