我在mongodb中有两个表的结构:
> db.mapping.find()
{ "_id" : ObjectId("52d74f4941538c0b386090af"),
"tc" : DBRef("fttc", ObjectId("52d74f4841538c0b3860902e")),
"hit" : { "24" : 1, "25" : 1, "26" : 1, "27" : 2}}
...
> db.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"?
有没有查询语句?
任何帮助或建议将不胜感激!
您要求的是连接,这不是MongoDB中支持的服务器端功能(根据设计)。
假设您的mapping
集合当前只有一个指向fttc
集合的 DBref,则必须通过使用多个查询并在应用程序中联接结果来解决此问题。这将在服务器端进行三个查询:一个用于查找mapping
文档,一个用于查找相关的fttc
文档,最后在fttc
上搜索具有相同full
属性的匹配文档。
在MongoDB中解决此问题的更好方法是对要查询的full
属性进行非规范化,以便它最终保存在两个集合中。
然后,您的映射文档将如下所示:
{ "_id" : ObjectId("52d74f4941538c0b386090a0"),
"tc" : DBRef("fttc", ObjectId("52d74f4841538c0b3860902e")),
"full" : "build1111_tastcase_20",
"hit" : { "24" : 3, "25" : 3 }
}
查找相关fttc
文档的查询成为一个简单的find()
。 由于要从两个集合中获取数据,因此仍需要进行两次查询,但这比当前方法少一个查询:
doc = db.mapping.findOne({"_id" : ObjectId("52d74f4941538c0b386090a0")})
related = db.fttc.find({"full" : doc.full});
您可以通过db.dereference(db.mapping.find_one()['tc'])['full']
访问"full"