java - 返回 Json 中等于搜索字符串的嵌套元素 - mongodb

标签 java json mongodb

我在 Mongo db 中有以下 json 文档。 show 元素将包含多个季节元素,其中还将包含多个剧集元素,而剧集元素又包含多个 QuestionEntry 元素。

我想返回多个 QuestionElements,其中 QuestionElements 元标记条目等于我的搜索。例如。如果一个metaTag元素等于我的字符串,则返回它的父questEntry元素并搜索嵌套在show中的所有元素。

{
"show":[
  {
     "season":[
        {
           "episodes":[
              {
                 "questionEntry":{
                    "id":1,
                    "info":{
                       "seasonNumber":1,
                       "episodeNumber":5,
                       "episodeName":"A Hero Sits Next Door"
                    },
                    "questionItem":{
                       "theQuestion":"What is the name of the ringer hired by Mr. Weed?",
                       "attachedElement":{
                          "type":1,
                          "value":""
                       }
                    },
                    "options":[
                       {
                          "type":1,
                          "value":"Johnson"
                       },
                       {
                          "type":1,
                          "value":"Hideo"
                       },
                       {
                          "type":1,
                          "value":"Guillermo"
                       }
                    ],
                    "answer":{
                       "questionId":1,
                       "answer":3
                    },
                    "metaTags":[
                       "Season 1",
                       "Episode 5",
                       "Trivia",
                       "Arya Stark",
                       "House Stark"
                    ]
                 }
              }
           ]
        }
     ]
   }
 ]
}

我在 Windows 8.1 中使用最新的 Java Mongo 驱动程序并使用 Mongodb 2.4.4。所以我的问题是,在整个节目集合中返回与我的搜索字符串匹配的单个或多个 qestionEntry 元素的最佳方法是什么?

希望这里有人可以帮助我。

编辑:

private DB mongoDatabase;
private DBCollection mongoColl;
private DBObject dbObject;

// Singleton class
// Create client (server address(host,port), credential, options)
        mongoClient = new MongoClient(new ServerAddress(host, port), 
                Collections.singletonList(credential),
                options);

mongoDatabase = ClientSingleton.getInstance().getClient().getDB("MyDB");

最佳答案

请尝试以下操作:

 db.exp.aggregate([{"$redact":{"$cond": { if: {$gt:[ {"$size": {
 $setIntersection : [ { "$ifNull": [ "$metaTags", []]}, 
 ["House Stark"]]} } , 0 ]} , then:"$$PRUNE",
 else:"$$DESCEND" }}}]).pretty();

[或]

编辑:

db.exp.aggregate([{"$unwind":"$show"},
 {"$unwind":"$show.season"},
 {"$unwind":"$show.season.episodes"},
 {"$match" : {"show.season.episodes.questionEntry.metaTags":{"$in": 
   ["Trivia"]}}},
 {"$group":{"_id":"$_id","episodes":{"$push":"$show.season.episodes"}
]);

JAVA代码:

    MongoClient client = new MongoClient();
    List<String> continentList = Arrays.asList(new String[]{"Trivia"});
    DB db = client.getDB("example");
    DBCollection coll = db.getCollection("exp");
    DBObject matchFields = new 
       BasicDBObject("show.season.episodes.questionEntry.metaTags", 
      new BasicDBObject("$in", continentList));
    DBObject groupFields = new BasicDBObject( "_id",
       "$_id").append("episodes", 
       new BasicDBObject("$push","$show.season.episodes"));
    DBObject unwindshow = new BasicDBObject("$unwind","$show");
    DBObject unwindsea = new BasicDBObject("$unwind", "$show.season");
    DBObject unwindepi = new BasicDBObject("$unwind", 
      "$show.season.episodes");
    DBObject match = new BasicDBObject("$match", matchFields);
    DBObject group = new BasicDBObject("$group", groupFields);      
    AggregationOutput output = 
    coll.aggregate(unwindshow,unwindsea,unwindepi,match,group);

    for (DBObject result : output.results()) {
         System.out.println(result);
         }

关于java - 返回 Json 中等于搜索字符串的嵌套元素 - mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31574779/

相关文章:

c# - 使用 mongodb C# 驱动程序进行分组和投影

java - FileNameExtensionFilter 构造函数被检查为未定义

java - 程序执行时无法正确写入/读取文件

python - 使用 urllib2 检查响应

java - 使用 Gson 反序列化对象 Json 列表

javascript - Mongodb $inc 返回双倍

python - 在 mongodb 中存储对象值

java - 如何查找一个字符串在另一个字符串中的出现情况,而该字符串没有嵌入到另一个单词中?

java - 导入常量类字段的简称

javascript - 从 &lt;script&gt; 标签读取 JSON