Как запросить mongodb с помощью DBRef - PullRequest
52 голосов
/ 01 июня 2011

предположим, у меня есть следующая структура данных:

var user = {_id: 'foo', age: 35};
var post = {_id: '...', author: {$ref: user, $id: 'foo'},...};

Как я могу запросить все сообщения, на которые ссылается пользователь [foo]? Я пробовал следующее, но не работает:

db.post.find('author._id': 'foo');
var u = db.user.find({_id: 'foo'});
db.post.find('author': u);

Также я не могу найти ответ из официального документа и Google!

У кого-нибудь есть идеи?

Ответы [ 6 ]

80 голосов
/ 01 июня 2011

Понял:

db.post.find({'author.$id': 'foo'})
11 голосов
/ 12 июля 2013

Вы можете использовать ссылку. $ Id, но она будет игнорировать любые индексы в этих полях. Я бы посоветовал игнорировать этот метод, если вы не запрашиваете его напрямую через терминал или хотите быстро что-то найти. При использовании больших коллекций вы захотите проиндексировать поле и запросить его, используя метод ниже.

Если вы хотите использовать индексный запрос, используя следующее:

db.post.find('author' : { "$ref" : 'user', "$id" : 'foo' , "$db" :'database_name' })

Если foo является идентификатором объекта

db.post.find('author' : { "$ref" : 'user', "$id" : ObjectId('foo') , "$db" :'database_name' })

Вы можете создать указатель на автора по

db.post.ensureIndex( {'author' : 1 } );
10 голосов
/ 30 января 2016

В этом db.post.find('author.$id': 'foo') отсутствует {}, поэтому правильное предложение:

db.post.find({'author.$id': 'foo'})

Также это может быть достигнуто с помощью:

db.post.find({'author': DBRef("user", ObjectId('foo'))})

Но это более компактно ипрактичный первый способ.

1 голос
/ 31 августа 2017

Для тех, кто ищет Java-решение для этого, тогда, если вы используете mongojack , это действительно просто:

collection.find(DBQuery.is("user", new DBRef(user.getId(), User.class)));

Где коллекция - коллекция JacksonDBC.

0 голосов
/ 20 мая 2013

Использование Mongo 2.4.1 версии

Вот как вы это делаете в командной строке для сбора OLA, где @DBRef dbrefName

db.OLA.find({"dbrefName.someFieldValue" : "Personal"});

Точный запрос

db.OLA.find({"dbrefName.$id" : ObjectId("1234")});

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

В mongoengine вы должны просто использовать экземпляр ссылочного объекта. Он должен иметь установленный идентификатор. Предположим, автор является экземпляром документа Author. Итак, используя это:

Post.objects(author__eq=author)

Вы можете просмотреть все сообщения этого автора. Post.author должен быть определен как ReferenceField

...