Поиск документов по массиву DBRefs

решение, вероятно, смотрит мне в лицо, но мне не повезло найти его. Моя проблема в том, что мне нужно найти все документы, которые содержат указанный 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 может не содержать DBRefs, другие могут содержать 1, а другие могут содержать более 1).

как это свершилось?

2 ответов


Я бы рекомендовал сбрасывать DBRefs в пользу простого хранения _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, используя содержимое


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

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

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

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