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?
Je l'ai:
db.post.find({'author.$id': 'foo'})
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 } );
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.
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.
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