使用DBRef查询MongoDB中的其他属性

时间:2014-01-17 04:14:16

标签: mongodb pymongo dbref

我在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()。全

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的属性“完整”为“ build1111_tastcase_20 '?

有查询语句吗?

任何帮助或建议都将受到高度赞赏!

2 个答案:

答案 0 :(得分:1)

有效的是你要求的是一个连接,它不是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});

答案 1 :(得分:0)

您访问“完整”#39;按db.dereference(db.mapping.find_one()['tc'])['full']