Подтвердить что ты не робот

Как запросить mongodb с помощью DBRef

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

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!

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

4b9b3361

Ответ 1

Получил это:

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

Ответ 2

Вы можете использовать ссылку $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 } );

Ответ 3

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

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

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

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

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

Ответ 4

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

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

Где коллекция представляет собой JacksonDBCollection.

Ответ 5

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

Post.objects(author__eq=author)

вы можете просмотреть все записи этого автора. Post.author следует определять как ReferenceField

Ответ 6

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

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

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

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

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