0

我有两个收藏:

集合 1:标签

{“标签名”:“标签1”,“标签”:“id1”}

集合 2:问题

{“问题”:“1”。"title":"问题标题", "tags":tag1 }

我想知道一个可以毫无疑问地给我所有标签的查询。

在 sql 中,它就像 select * from tags where tagname not in(从问题中选择标签)

Form shell 我可以做类似的事情

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

db.tags.find({tagname:{$nin:c}})

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

4

1 回答 1

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));
于 2013-07-24T10:17:11.790 回答