2014-09-04 3 views
0

У меня есть следующий код,:Монго DB Совокупный запрос возвращает пачки

CommandResult cr = db.doEval("db." + collectionName + ".aggregate(" 
       + query + ")"); 

результат команды дает в партиях, где мне нужно, чтобы получить в одном значении.

Batch Result:{ "serverUsed" : "/servername" , "retval" : { **"_firstBatch**" : [ { "visitor_localdate" : 1367260200} , { "visitor_localdate" 

Ожидаемый результат:

{ "serverUsed" : "/servername" , "retval" : { "**result**" : [ { "visitor_localdate" : 1367260200} , { "visitor_localdate" 

Монго DB мы используем это 2.6.4 с 64 бит.

Может ли кто-нибудь помочь в этом ?. Я предполагаю, что есть проблема с настройкой.

ответ

0

Существовал что-то связано с bacth добавил в MongoDB 2.6, более подробно здесь: http://docs.mongodb.org/manual/reference/method/db.collection.aggregate/#example-aggregate-method-initial-batch-size

Из ссылки

db.orders.aggregate(
[ 
     { $match: { status: "A" } }, 
     { $group: { _id: "$cust_id", total: { $sum: "$amount" } } }, 
     { $sort: { total: -1 } }, 
     { $limit: 2 } 
], 
     { 
     cursor: { batchSize: 0 } 
     } 
) 

Вы можете быть с курсором партия в вашем агрегатного запросе

1

Ты делаешь все это неправильно. Вам не нужно прыгать через обручи, как это, чтобы получить динамическое имя коллекции. Просто используйте этот синтаксис вместо:

var collectionName = "collection"; 

var cursor = db[collectionName].aggregate(pipeline) 

Где pipeline также просто массив документов трубопроводов этапа, а именно:

var pipeline = [{ "$match": { } }, { "$group": { "_id": "$field" } }]; 

В любом случае метод .aggregate() возвращает курсор, вы можете перебирать результаты с стандартные методы:

while (cursor.hasNext()) { 
    var doc = cursor.next(); 
    // do something with doc 
} 

Но вы на самом деле делают это в Java, а не JavaScript, поэтому из базового драйвера с соединением на объекте db вы просто сделать это:

DBObject match = new BasicDBObject("$match", new BasicDBObject()); 
    DBObject group = new BasicDBObject("$group", new BasicDBObject()); 

    List pipeline = new ArrayList(); 
    pipeline.add(match); 
    pipeline.add(group); 
    AggregationOutput output = db.getCollection("collectionName").aggregate(pipeline); 

Трубопровод в основном списке интерфейс DBObject информации, где вы строите документы BSON, представляющие требуемые операции.

В результате здесь имеет AggregationOutput, но курсор, как результаты могут быть получены при дополнительной подаче AggregationOptions в качестве дополнительной опции для pipeline

+0

Hi ..Нейл, Спасибо за информацию, Мы пытаемся понять это на Java. Если функция Aggreate dosent воспринимает pipline как аргумент напрямую. –

+0

@BlueWhale Конечно. Позвольте мне запустить код и повторно пометить ваш вопрос. –

+0

@BlueWhale Там вы идете, все довольно просто. Вам не нужно отправлять код на сервер в качестве JavaScript для этого. –

0

Ответ от Нила Ланн не так, но я хочу добавить, что результат, который вы ожидали является результатом для версий mongodb раньше, чем v2.6.

Прежде чем v2.6, функция агрегата вернула только один документ, содержащий поле результата, которое содержит массив документов, возвращаемых конвейером, и поле ok, которое содержит значение 1, указывающее успех. Однако, из mongodb v2.6 on, функция агрегата возвращает курсор (если опция $ out не использовалась).

См examples in mongodb v2.6 documentation и сравнить, как он работал раньше v2.6 (т.е. в v2.4):