1

我在 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")

但是,如何从mapping中找到所有项目,其 tc 的属性“ full ”是“ build1111_tastcase_20 ”?

有查询语句吗?

任何帮助或建议将不胜感激!

4

2 回答 2

1

实际上,您要求的是联接,这不是 MongoDB 中受支持的服务器端功能(按设计)。

鉴于您的mapping集合当前只有一个 DBref 指向该fttc集合,您必须通过使用多个查询并在应用程序中加入结果来解决此问题。这将在服务器端进行三个查询:一个查找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});
于 2014-01-23T06:01:02.507 回答
0

您通过以下方式访问“完整”db.dereference(db.mapping.find_one()['tc'])['full']

于 2014-07-30T11:01:42.463 回答