如何使用DBRef查询mongodb

时间:2011-06-01 01:18:39

标签: reference 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);

我也无法从官方文档和谷歌找到答案!

任何人都有任何想法?

6 个答案:

答案 0 :(得分:79)

知道了:

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

答案 1 :(得分:11)

您可以使用。$ id引用,但它会忽略这些字段上的任何索引。 除非你直接通过终端查询它或想快速查找某些内容,否则我建议忽略该方法。在使用大型集合时,您需要索引该字段并使用以下方法对其进行查询。

如果要使用以下内容使用索引查询:

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' })

您可以通过

在作者上创建索引
db.post.ensureIndex( {'author' : 1 } );

答案 2 :(得分:9)

db.post.find('author.$id': 'foo')缺少{},因此正确的句子是:

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

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

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

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

答案 3 :(得分:1)

对于任何寻找Java解决方案的人来说,如果你使用mongojack它真的很容易:

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

集合是JacksonDBCollection。

答案 4 :(得分:0)

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

Post.objects(author__eq=author)

您可以浏览此作者的所有帖子。 Post.author应该被定义为ReferenceField

答案 5 :(得分:-2)

使用Mongo 2.4.1版本

这是在@DBRef dbrefName

的OLA集合的命令行中执行此操作的方法

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

确切查询

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