我有两个系列:
集合1:标签
{ “变量名”:“标签1”, “标签识别”: “ID1” }
收集2:问题
{ “questionid”: “1”。 “标题”:“问题标题”, “标签”:标签1 }
我想知道一个查询,它可以给我所有的标签,没有问题。
在sql中它会是这样的 从标签名不在的标签中选择*(从问题中选择标签)
表单shell我可以做类似
的事情var c = db.questions.distinct('tags');
db.tags.find({标记名:{$ nin的:C}})
我如何在java中做同样的事情
答案 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));