61

假设我有以下数据结构:

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

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

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

官方文档和google也找不到答案!

有人有什么想法吗?

4

6 回答 6

96

知道了:

db.post.find({'author.$id': 'foo'})
于 2011-06-01T02:06:18.093 回答
17

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

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

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

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

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

于 2016-01-29T22:34:42.470 回答
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 } );
于 2013-07-12T16:12:42.503 回答
3

对于正在寻找 Java 解决方案的任何人,如果您使用的是mongojack,它真的很容易:

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

其中collection 是JacksonDBCollection。

于 2017-08-31T18:41:37.097 回答
1

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

Post.objects(author__eq=author)

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

于 2013-03-30T03:51:49.097 回答
-1

使用 Mongo 2.4.1 版本

这就是您在命令行上为 OLA 收集执行此操作的方式,其中@DBRef dbrefName

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

精确查询

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

于 2013-05-20T02:02:21.357 回答