web-dev-qa-db-fra.com

Comment interroger mongodb avec DBRef

supposons que j'ai la structure de données suivante:

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

Comment interroger tous les articles faisant référence à l'utilisateur [foo]? J'ai essayé ce qui suit mais je n'ai pas travaillé:

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

je ne trouve pas non plus la réponse du document officiel et de Google!

Quelqu'un a une idée?

49
Gelin Luo

Je l'ai:

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

Vous pouvez utiliser la référence. $ Id mais elle ignorera tous les index sur ces champs. Je suggérerais d'ignorer cette méthode sauf si vous l'interrogez directement via le terminal ou si vous souhaitez rechercher rapidement quelque chose. En utilisant de grandes collections, vous voudrez indexer le champ et l'interroger en utilisant la méthode ci-dessous. 

Si vous souhaitez utiliser une requête d'index en utilisant les éléments suivants:

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

Si foo est un identifiant d'objet

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

Vous pouvez créer un index sur l'auteur en

db.post.ensureIndex( {'author' : 1 } );
11
RedPhoenix

Le {} est manquant dans db.post.find('author.$id': 'foo'); la phrase correcte est donc:

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

Cela peut également être réalisé avec:

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

Mais est plus compact et pratique la première façon.

8
Mariano Ruiz

Si vous utilisez mongojack c'est vraiment facile pour ceux qui recherchent une solution Java,

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

Où collection est une collection JacksonDBC.

0
dannrob

Dans mongoengine, vous devez simplement utiliser l'instance de l'objet référencé. L'ID doit être défini . Supposons que l'auteur est l'instance de document Author. Donc, en utilisant ceci:

Post.objects(author__eq=author)

vous pouvez consulter toutes les publications de cet auteur . Post.author devrait être défini comme ReferenceField

0
Kostanos