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

公式文書とグーグルからも答えを見つけることができません!

誰かが何か考えを持っていますか?

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

コレクションは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

Mongo2.4.1バージョンを使用する

これは、OLAコレクションのコマンドラインで行う方法です。@DBRef dbrefName

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

正確なクエリ

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

于 2013-05-20T02:02:21.357 に答える