Mongodb组合查询

时间:2013-07-23 23:31:48

标签: mongodb mongodb-java

我有两个系列:

集合1:标签

{ “变量名”:“标签1”, “标签识别”: “ID1” }

收集2:问题

{ “questionid”: “1”。 “标题”:“问题标题”, “标签”:标签1 }

我想知道一个查询,它可以给我所有的标签,没有问题。

在sql中它会是这样的 从标签名不在的标签中选择*(从问题中选择标签)

表单shell我可以做类似

的事情
  

var c = db.questions.distinct('tags');

     

db.tags.find({标记名:{$ nin的:C}})

我如何在java中做同样的事情

1 个答案:

答案 0 :(得分:2)

您无法使用当前架构一步完成此操作。为了让您这样做,您需要存储每个标记的问题ID,而不是现在的标记。通常,在MongoDB中,与关系数据库相比,您可以“相反地”存储集合之间的关系。例如,您可以将其存储为:

<强>代码

{ "tagname": "tag1", "tagid": "id1", "questions" : [ 1, 3 ] }
{ "tagname": "tag2", "tagid": "id2" }

<强>问题

{ "questionid": 1. "title": "question title" }
{ "questionid": 2, "title": "question title" }
{ "questionid": 3, "title": "question title" }

或者标签:

{ "questionid": 1. "title": "question title", tags: [ "id1" ] }
{ "questionid": 2, "title": "question title" }
{ "questionid": 3, "title": "question title", tags: [ "id1" ] }

您选择哪种变体取决于您的数据需求。如果您需要更新标签/问题,那么使用标签存储标签,问题及其标签会使用更多存储空间并导致更多工作,但它确实使查询更容易。例如,在上述修改后,您可以轻松地询问所有标签:

db.tags.find( { questions: { $exists: true } } );

要用Java进行查询,我建议您查看http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-java-driver/,其中有很多示例。再往下一点是:http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-java-driver/#getting-a-set-of-documents-with-a-query表示您可以执行上述查询,如:

query = new BasicDBObject("questions", new BasicDBObject("$exists", true));