2015-07-31 1 views
1

Привет Я использую Java API для подключения к моей базе данных. Я использую новые классы для connecto, поскольку те, которые почти во всех примерах отмечены, устарели Я использую MongoClient для подключения к MongoDatabase db. После этого я:Встроенный Java API-интерфейс MongoDB не возвращает результаты

MongoCollection<Document> coll = db.getCollection("collName"); 
AggregateIterable<Document> res = collection.aggregate(myquery); 
for(Document d : res) 
{ 
    System.out.println(d.toJson()); 
} 

Это ничего не печатает. Я попытался использовать result.first() тоже, но он только печатает null.

Теперь причина, по которой я не указываю подробности о моих данных, заключается в следующем. Если я посмотрю в файле журнала в/var/log/mongodb, я вижу переведенный запрос. Если я отправлю ТОЧНЫЙ запрос в оболочку монго. Он просто работает как шарм. Я нашел здесь сообщение, в котором говорится, что порядок моих агрегатных функций может быть проблемой, но это не имеет смысла, если оно работает, если оно вставлено в оболочку.

Так вот мой немного переделал запрос

Document sort = new Document("$sort", new Document("Day", 1)); 

    Document matchBeforeUnwindDayOfTheWeek = new Document("Day", day); 

    Document matchBeforeUnwindVar1 = new Document("'value.Data'", new Document("$elemMatch", 
      new Document("var1", new Document("$gt", minvar1).append("$lt", maxvar1))));   
    Document matchBeforeUnwindVar2 = new Document("'value.Data'", new Document("$elemMatch", 
      new Document("var2", new Document("$gt", mingvar2).append("$lt", maxvar2)))); 

    List<Document> matchBeforeUnwindAnd = new LinkedList<Document>(); 
    matchBeforeUnwindAnd.add(matchBeforeUnwindDayOfTheWeek); 
    matchBeforeUnwindAnd.add(matchBeforeUnwindVar1); 
    matchBeforeUnwindAnd.add(matchBeforeUnwindVar2); 

    Document matchBeforeUnwind = new Document("$match", new Document("$and", matchBeforeUnwindAnd)); 

    Document unwind = new Document("$unwind", "$value.Data"); 

    Document matchAfterUnwindVar1 = new Document("'value.Data.var1'", 
      new Document("$gt", minvar1).append("$lt", minvar1)); 
    Document matchAfterUnwindVar2 = new Document("'value.Data.var2'", 
      new Document("$gt", minvar2).append("$lt", maxvar2)); 

    List<Document> matchAfterUnwindAnd = new LinkedList<Document>(); 
    matchAfterUnwindAnd.add(matchAfterUnwindVar1); 
    matchAfterUnwindAnd.add(matchAfterUnwindVar2); 

    Document matchAfterUnwind = new Document("$match", new Document("$and", matchAfterUnwindAnd)); 

    Document groupFields = new Document("_id", "$_id"); 
    groupFields.put("Grouped", new Document("$push", "$value.Data")); 

    Document group = new Document("$group", groupFields); 

    List<Document> query = new LinkedList<Document>(); 
    query.add(sortByDayOfTheWeek); 
    query.add(matchBeforeUnwind); 
    query.add(unwind); 
    query.add(matchAfterUnwind); 
    query.add(group); 

    AggregateIterable<Document> result = collection.aggregate(query); 

Edit: Я попробовал его с очень простым запросом, как один размещено ниже. Запросы все еще хорошо переносятся в файле журнала.

+2

Хорошо, проблема в определении конвейера агрегации вполне вероятна, и это полностью отсутствует в вашем вопросе. Пожалуйста, отредактируйте свой вопрос. –

+0

Да, но как это могло быть? Я имею в виду, что я могу увидеть мой конвейер в файле журнала после его выполнения, и если я скопирую его в оболочку, он просто работает. – Minalcar

+1

Я думаю, что момент, который я делал, «мы», не может его увидеть. Как насчет совместного использования, может быть (вероятно) есть проблема там, что вы не видите, но кто-то еще будет –

ответ

0

ошибка была '' символов. Я думал, что я нуждаюсь в них из-за оператора. Ну что ж. Спасибо за вашу помощь.

1

С ref. of mongo java driver вы должны изменить for заявление, как показано ниже:

import com.mongodb.*; 
import com.mongodb.Block; 
import com.mongodb.client.AggregateIterable; 
import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase; 
import org.bson.Document; 
import org.bson.types.ObjectId; 
import static java.util.Arrays.asList; 

MongoClient mongoClient = new MongoClient("localhost", 27017); 
MongoDatabase database = mongoClient.getDatabase("demo"); 
MongoCollection <Document> collection = database.getCollection("collectionName"); 
AggregateIterable <Document> res = collection. 
aggregate(asList(
    new Document("$match", new Document("_id", new ObjectId("55a8ad7f68d7f0852ea1c8a7"))))); 

res.forEach(new Block <Document>() { 
     @Override 
    public void apply(final Document document) { 
     System.out.println(document.toJson()); 
    } 
}); 
+0

Я пробовал это, но это не помогло. Если я загляну в лог-файл, я вижу, что reslen очень мал для возврата в java-приложение. Так что это не проблема со мной, а с возвратом. – Minalcar

+0

Ох, и я уверен, что сервер действительно выполняет агрегацию, так как время, требуемое, почти одинаково для оболочки, а API – Minalcar

+0

- лучший способ опубликовать ваш код формирования запроса, потому что я протестировал вышеуказанный код, и он отлично работает , – Yogesh

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