如何使用DBRef查询mongodb

Gel*_*Luo 56 reference mongodb dbref

假设我有以下数据结构:

var user = {_id: 'foo', age: 35};
var post = {_id: '...', author: {$ref: user, $id: 'foo'},...};
Run Code Online (Sandbox Code Playgroud)

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

db.post.find('author._id': 'foo');
var u = db.user.find({_id: 'foo'});
db.post.find('author': u);
Run Code Online (Sandbox Code Playgroud)

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

任何人有任何想法?

Gel*_*Luo 86

得到它了:

db.post.find({'author.$id': 'foo'})
Run Code Online (Sandbox Code Playgroud)

  • 有谁知道如何使用MongoEngine完成相同的工作? (3认同)
  • 这是我能想到的最好的:`Post.objects(__ raw __ = {'author.$ id':'foo'})` (3认同)
  • 是的,它通常是`ObjectId('....')`,它也可能是`NumberLong(...)`,也可能是''foo'`,它实际上取决于你使用的是哪种类型id列 (3认同)
  • 我不得不使用db.post.find({'author.$ id':ObjectId('foo')})来实现这一点. (2认同)

小智 11

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

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

db.post.find('author' : { "$ref" : 'user', "$id" : 'foo' , "$db" :'database_name' })
Run Code Online (Sandbox Code Playgroud)

如果foo是一个对象id

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

您可以在作者上创建索引

db.post.ensureIndex( {'author' : 1 } );
Run Code Online (Sandbox Code Playgroud)


Mar*_*uiz 11

db.post.find('author.$id': 'foo')已经错过了{},所以正确的句子是:

db.post.find({'author.$id': 'foo'})
Run Code Online (Sandbox Code Playgroud)

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

db.post.find({'author': DBRef("user", ObjectId('foo'))})
Run Code Online (Sandbox Code Playgroud)

但第一种方式更紧凑实用.