1

mongodb に 2 つのテーブル構造があります。

> db.mapping.find()

{ "_id" : ObjectId("52d74f4941538c0b386090af"), 
  "tc" : DBRef("fttc", ObjectId("52d74f4841538c0b3860902e")), 
  "hit" : { "24" : 1, "25" : 1, "26" : 1, "27" : 2}}
...

> デシベル.fttc.find()

{ "_id" : ObjectId("52d74f4841538c0b38609041"), 
  "full" : "build1111_tastcase_20", 
  "tags" : [  "tag_0" ] }
...

> db.mapping.find()[0].tc.fetch().full

build1111_tastcase_1

> db.mapping.find({'tc.$id':ObjectId("52d74f4841538c0b3860902e")})

{ "_id" : ObjectId("52d74f4941538c0b386090a0"), 
  "tc" : DBRef("fttc", ObjectId("52d74f4841538c0b3860902e")),
  "hit" : { "24" : 3, "25" : 3 } }
...

これで、tc の属性「id」がであるアイテムを取得できますObjectId("52d74f4841538c0b3860902e")

しかし、 tc の属性 ' full ' が ' build1111_tastcase_20 ' であるmappingからすべてのアイテムを見つけるにはどうすればよいでしょうか?

クエリステートメントはありますか?

どんな助けや提案も大歓迎です!

4

2 に答える 2

1

事実上、あなたが求めているのは結合です。これは、MongoDB でサポートされているサーバー側の機能ではありません (設計上)。

コレクションには現在、コレクションmappingを指す DBref しかないfttcため、アプリケーションで複数のクエリを使用して結果を結合することで、これを解決する必要があります。これには、サーバー側で 3 つのクエリが必要です。1 つはmappingドキュメントの検索、もう 1 つは関連fttcドキュメントの検索、最後に同じ属性fttcを持つ一致するドキュメントの検索です。full

MongoDB でこれにアプローチするより良い方法は、fullクエリを実行する属性を非正規化することです。これにより、最終的に両方のコレクションに保存されます。

マッピング ドキュメントは次のようになります。

{ "_id" : ObjectId("52d74f4941538c0b386090a0"), 
  "tc" : DBRef("fttc", ObjectId("52d74f4841538c0b3860902e")),
  "full" : "build1111_tastcase_20",
  "hit" : { "24" : 3, "25" : 3 }
}

fttc関連ドキュメントを検索するためのクエリは単純になりfind()ます。2 つのコレクションからデータを取得しているため、2 つのクエリを作成する必要がありますが、これは現在のアプローチよりも 1 つ少ないクエリです。

doc = db.mapping.findOne({"_id" : ObjectId("52d74f4941538c0b386090a0")})
related = db.fttc.find({"full" : doc.full});
于 2014-01-23T06:01:02.507 に答える
0

あなたは「フル」にアクセスしますdb.dereference(db.mapping.find_one()['tc'])['full']

于 2014-07-30T11:01:42.463 に答える