如何用DBRef查询mongodb

假设我有以下数据结构:

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

我如何查询引用用户[foo]的所有post? 我尝试了以下但不工作:

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

我也不能从官方文档和谷歌find答案!

任何人有任何想法?

得到它了:

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

您可以使用。$ id引用,但会忽略这些字段上的所有索引。 我会build议忽略这种方法,除非你直接通过terminal查询,或者想快速查找。 在使用大集合时,您将需要索引字段并使用下面的方法查询它。

如果你想使用下面的索引查询:

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

如果foo是一个对象ID

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

您可以通过创build作者索引

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

这个db.post.find('author.$id': 'foo')缺less{} ,所以正确的语句是:

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

这也可以通过以下方式实现:

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

但是第一种方式更加紧凑和实用。

在mongoengine中,你应该只使用被引用对象的实例。 它应该有ID集。 假设作者是作者文档实例。 所以使用这个:

 Post.objects(author__eq=author) 

你可以通过这个作者的所有post。 Post.author应该被定义为ReferenceField

对于任何正在寻找Java解决scheme的人来说,如果你正在使用mongojack,那真的很简单:

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

哪里collections是JacksonDBCollection。

使用Mongo 2.4.1版本

这是如何在OLA集合的命令行中执行的@DBRef dbrefName

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

确切的查询

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