запрос mongodb по типу DBRef

Как мне превратить этот запрос в действительный запрос mongodb в оболочке mongodb.

{ 'cars.owner.$ref' : 'users' } 

cars.owner здесь является DBRef, но $ref недействителен

Я получаю эту ошибку:

"$err" : "Positional operator does not match the query specifier."

Моя цель здесь - выяснить, есть ли какие-либо автомобили, «принадлежащие» другим коллекциям, а не пользователям.


person Willem D'Haeseleer    schedule 31.07.2015    source источник
comment
Когда вы разрешаете ссылки только на одну коллекцию, обычно лучше хранить только _id вместо DBRef.   -  person Philipp    schedule 01.08.2015
comment
@Philipp Филипп, я просто изучаю данные. Какова мотивация просто хранить _id вместо DBRef?   -  person Willem D'Haeseleer    schedule 01.08.2015
comment
DBRef в основном считается устаревшим, и я бы не возлагал больших надежд на постоянную поддержку драйверов в будущем. Это была ранняя идея, и не очень хорошо продуманная. Формат также сохраняет имена полей, которые противоречат установленным в настоящее время соглашениям об именах для зарезервированных символов. Общее соглашение теперь состоит в том, чтобы просто хранить _id документа и, возможно, коллекцию и/или пространство имен базы данных самостоятельно или с помощью логики внешней схемы, которая описывает отношения и только _id. Упорство с DBRef — это темная дорога, полная ужасов. Убирайся, пока можешь.   -  person Blakes Seven    schedule 01.08.2015
comment
@BlakesSeven Где в документах я могу найти, что DBRef устарел?   -  person Willem D'Haeseleer    schedule 01.08.2015
comment
@WillemD'haeseleer DBRef — это объект, который включает в себя _id, коллекцию и, возможно, базу данных. В большинстве ситуаций вы уже знаете коллекцию и базу данных, где будет найдена ссылка, поэтому они бесполезны.   -  person Philipp    schedule 01.08.2015


Ответы (3)


Вы можете запросить DBRef в оболочке Mongo, но вы должны использовать функцию DBRef(). Ссылка должна включать как минимум $ref и $id. Из документов:

Документы DBRef похожи на следующий документ:

{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }

Когда cars.owner является ссылкой на документ в коллекции пользователей, запрос на поиск всех автомобилей, владельцем которых является определенный _id, может выглядеть так (при условии, что обе коллекции находятся в одной базе данных):

db.cars.find({ "owner" : DBRef("users", ObjectId("<user _id value>")) })

Значения $ref и $id нельзя запрашивать напрямую. DBRef наиболее полезен в случае, когда в одном и том же документе есть несколько ссылок на разные коллекции. Использование DBRef может быть излишним, если в документе есть только одна ссылка, как уже упоминалось другими.

Если вам нужно сослаться на разные коллекции в поле владельцев, вам, вероятно, будет удобнее использовать отдельные поля owner_collection и owner_id. Запрос для поиска всех владельцев, которые не являются пользователями, будет стандартным запросом:

db.cars.find({ owner_collection: { $ne: "users" } })
person dreese    schedule 03.08.2015

В документации MongoDB (database-reference) говорится следующее:

Приложения MongoDB используют один из двух методов для связывания документов:

  • Ручные ссылки, когда вы сохраняете поле _id одного документа в другом документе в качестве ссылки. Затем ваше приложение может выполнить второй запрос, чтобы вернуть соответствующие данные. Эти ссылки просты и достаточны для большинства случаев использования.
  • DBRefs — это ссылки из одного документа в другой, использующие значение поля _id первого документа, имя коллекции и, необязательно, имя его базы данных. Включая эти имена, DBRefs позволяет легко связать документы, расположенные в нескольких коллекциях, с документами из одной коллекции. Чтобы разрешить DBRefs, ваше приложение должно выполнить дополнительные запросы, чтобы вернуть документы, на которые есть ссылки. Многие драйверы имеют вспомогательные методы, которые автоматически формируют запрос для DBRef. Драйверы 1 не преобразуют DBRefs автоматически в документы.

Я не знаю о каких-либо планах, но я читал, что в настоящее время DBRefs должны быть объявлены устаревшими (?). Однако вы можете использовать метод fetch() для загрузки ссылочных документов. Например, у меня есть коллекция formView, в которой хранятся документы, содержащие (DBRef) ссылки на документы в коллекции formContent. Итак, бег:

var view = db.formView.findOne()
view.formContent
view.formContent.fetch()
view.formContent.fetch().code

... Приведет к следующему выводу:

DBRef("formContent", ObjectId("56cb155ea826872b67373e76"))
{
    "_id" : ObjectId("56cb155ea826872b67373e76"),
    "code" : "test_content",
    "version" : 0
}
test_content
person niko.makela    schedule 22.02.2016
comment

<parameterName>: DBRef("CollectionName", "_id Value")

поместите в коллекцию. Затем создайте Bean, имеющий имя поля в качестве имени параметра, и поместите аннотацию @Reference morphia orm, затем выполните операции, которые вы хотите

person Rudra    schedule 11.08.2016
comment
добавьте к нему описание - person piyushj; 11.08.2016
comment
Этот ответ не имеет смысла - person Willem D'Haeseleer; 11.08.2016