如何使用DBRef查询mongodb



假设我有以下数据结构:

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);

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

有人知道吗?

明白了:

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

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

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

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

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

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

您可以使用$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 } );

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

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

Where集合是JacksonDBCollection。

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

Post.objects(author__eq=author)

你可以浏览这个作者的所有帖子。Post.author应定义为ReferenceField

使用Mongo 2.4.1版本

以下是在OLA集合的命令行上执行操作的方式,其中@DBRef dbrefName

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

精确查询

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

相关内容

  • 没有找到相关文章

最新更新