2014-12-16 4 views
1

Запись запроса и обновления mongoDB в Java.MongoDB: запрос для поддокументов: Java

MongoDB Collection (Имя: сниженный) результат (карта-свертка результата) выглядит следующим образом:

Значение поле:

{ "value" : 

    { 
     "User_Name" : "Mitchamoreagent", 
     "tweets" : ["RT Perspectives: 
     Texas Insurer of Last Resort Charts Course Through Reform Law", "RT Texas sale 
     s tax-free weekend set for Aug. 19-21", "RT The New Normal: Billion-Dollar", "R 
     T Austin Water is responding to a 12-inch water main leak at Burnet Rd. and And 
     erson Lane in North Austin."] 
    } 
} 

Пытается найти все User_Name, чьи твиты содержат 'word', которое я могу указать с помощью regex.

Для этого я попробовал AggregationOutput, который отлично работает с простыми корпусами. Но эта структура, я не могу ее преодолеть.

Код:

DBObject match = new BasicDBObject("$match",new BasicDBObject("value",new BasicDBObject("tweets", new BasicDBObject("$regex",".*Texas.*")))); 
DBObject fields = new BasicDBObject("_id", 0); 
DBObject nest = new BasicDBObject("value", new BasicDBObject("User_ID", 1)); 
fields.put("value", 1); 
DBObject project = new BasicDBObject("$project", fields); 
AggregationOutput output = tweets.aggregate(match, project); 

Вот Техас "является слово, которое я пытаюсь найти, и я ожидаю выходного [Mitchamoreagent].

Но выход всегда есть исключение noRowsReturned.

ответ

2

Вы должны построить ваш $match операции этапа, как показано ниже:

DBObject regex = new BasicDBObject("$regex","Texas"); 
DBObject condition = new BasicDBObject("value.tweets",regex); 
DBObject match = new BasicDBObject("$match",condition); 

Соответствующий MongoDB запрос, который будет генерироваться в вашем вопросе будет:

{$match:{"value":{"tweets":{$regex:"Texas"}}}} 

, которые на самом деле должны быть выполнены в виде :

{$match:{"value.tweets":{$regex:"Texas"}}} 

Этап проекта должен быть построен s ниже:

Если вам нужно спроецировать значение вложенного поля как поле верхнего уровня, в этом случае User_name, вам нужно проецировать его с использованием псевдонимов, в этом случае псевдоним равен user_name.

DBObject fields = new BasicDBObject("_id", 0); 
fields.put("user_name", "$value.User_Name"); // project the user_name for each record. 

Выполнение трубопровода:

DBObject project = new BasicDBObject("$project", fields); 
AggregationOutput output = tweets.aggregate(match, project); 
+0

Вы можете также сказать мне, как следует «проект» должен выглядеть, если я только хочу «имя_пользователя» из результата. Поскольку я использую AggregationOutput output = tweets.aggregate (match, project); – rakemen

+0

Можете ли вы объяснить это «$ value.User_Name» в fields.put() – rakemen

+0

col.aggregate (match, project); «Col» в stmt, должно ли это быть именем всей коллекции? или это должно быть твиты, так как мы сопоставляем слово с твитами. Он по-прежнему дает мне пустой o/p, хотя я вижу значение через запрос в оболочке mongoDB. – rakemen

Смежные вопросы