2015-03-27 11 views
5

meteor mongo kabuğunda db.collection.group'u kullanabilirim ama Meteor.methods'dan kullanabilirim Meteor bunu desteklemiyor olabilir. aylara göre nesneler grupların dizidirMeteor sunucu tarafında mongo grubu nasıl yapılır

db.orders.group({ 
    keyf: function(doc) {return {year:doc.createdAt.toISOString().substring(0, 4)}}, 
    initial: {months:{}}, 
    reduce: function(order, result) { 
    var month = order.createdAt.getMonth()+1, 
     date = order.createdAt.getDate(); 

    month = result.months[month] || (result.months[month] = {}); 
    date = month[date] || (month[date] = []); 
    date.push(order); 
    }, 
    cond: {$and: [{createdAt: {$gt: new Date("2015-01-01")}, createdAt: {$lt: new Date("2015-12-31")}}]} 
}) 

beklemek sonucu ve daha sonra ay içindeki tarihlerine göre gruplandırılmış:

nasıl benzer bir şey yapacağını bir yöntem yazabilirsiniz.

P.S. orders, oldukça büyük bir koleksiyon ve gerçekten veritabanında gruplandırma yapmak istiyorum. Ben alıyorum

collection = Orders.rawCollection(); 
    params = { 
    keyf: function(doc) {return {year:doc.createdAt.toISOString().substring(0, 4)}}, 
    initial: {months:{}}, 
    reduce: function(order, result) { 
     var month = order.createdAt.getMonth()+1, 
      date = order.createdAt.getDate(); 

     month = result.months[month] || (result.months[month] = {}); 
     date = month[date] || (month[date] = []); 
     date.push(order); 
    }, 
    cond: {$and: [{createdAt: {$gt: new Date("2015-01-01")}, createdAt: {$lt: new Date("2015-12-31")}}]} 
    }; 
    Meteor.wrapAsync(collection.group, collection)(params); 

: Meteor v1.0.4 itibariyle

W20150327-13:26:24.924(2)? (STDERR) /Users/jaro/.meteor/packages/mongo/.1.1.0.1jqg8g6++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/connection/base.js:246 
W20150327-13:26:24.924(2)? (STDERR)   throw message;  
W20150327-13:26:24.924(2)? (STDERR)    ^
W20150327-13:26:24.929(2)? (STDERR) TypeError: undefined is not a function 
W20150327-13:26:24.929(2)? (STDERR)  at /Users/jaro/.meteor/packages/mongo/.1.1.0.1jqg8g6++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/collection/aggregation.js:229:22 
W20150327-13:26:24.931(2)? (STDERR)  at /Users/jaro/.meteor/packages/mongo/.1.1.0.1jqg8g6++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/db.js:1191:22 
W20150327-13:26:24.931(2)? (STDERR)  at /Users/jaro/.meteor/packages/mongo/.1.1.0.1jqg8g6++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/db.js:1903:9 
W20150327-13:26:24.931(2)? (STDERR)  at [object Object].Base._callHandler (/Users/jaro/.meteor/packages/mongo/.1.1.0.1jqg8g6++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/connection/base.js:453:41) 
W20150327-13:26:24.932(2)? (STDERR)  at /Users/jaro/.meteor/packages/mongo/.1.1.0.1jqg8g6++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/db.js:1758:29 
W20150327-13:26:24.932(2)? (STDERR)  at [object Object].Connection.write (/Users/jaro/.meteor/packages/mongo/.1.1.0.1jqg8g6++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/connection/connection.js:272:16) 
W20150327-13:26:24.932(2)? (STDERR)  at __executeQueryCommand (/Users/jaro/.meteor/packages/mongo/.1.1.0.1jqg8g6++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/db.js:1752:16) 
W20150327-13:26:24.932(2)? (STDERR)  at Db._executeQueryCommand (/Users/jaro/.meteor/packages/mongo/.1.1.0.1jqg8g6++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/db.js:1902:7) 
W20150327-13:26:24.933(2)? (STDERR)  at Db.command (/Users/jaro/.meteor/packages/mongo/.1.1.0.1jqg8g6++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/db.js:1183:8) 
W20150327-13:26:24.933(2)? (STDERR)  at Collection.group (/Users/jaro/.meteor/packages/mongo/.1.1.0.1jqg8g6++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/collection/aggregation.js:228:13) 
=> Exited with code: 8 

cevap

5

:


1.0.4 yılında rawCollection() hakkında bilgi Sonra bu çalıştı

Npm Mongo sürücüsünden toplama ve veritabanı nesnelerine doğrudan erişim sağlama Mongo.Collection

yeni rawCollection ve rawDatabase yöntemlerle Yani altta yatan toplama nesneyi almak için collection.rawCollection() çağırabilirsiniz:

var rawCollection = Orders.rawCollection(); 

Bu rawCollection MongoDB kabuğunda group yönteme eşdeğer bir yöntem group sahiptir . Altta yatan düğüm API'sı senkronize değildir, bu nedenle bir şekilde senkronize bir işleve dönüştürmek isteyeceksiniz. group birincil geri arama değildir fonksiyon argümanları sürdüğü için doğrudan Meteor.wrapAsync kullanamaz, bu nedenle bir ambalaj kağıdı ile bu geçici bir çözüm olacaktır: Eğer db.orders.group yapacağınız gibi size ordersGroup arayabilir, senin yöntemin İçinde

function ordersGroup(/* arguments */) { 
    var args = _.toArray(arguments); 
    return Meteor.wrapAsync(function (callback) { 
     rawCollection.group.apply(rawCollection, args.concat([callback])); 
    })(); 
} 

Mongo kabuğunda. Ancak, argümanlar yerine bir nesne değil de, ayrı ayrı geçirilir:

fazla bilgi için
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]]) 

, this documentation (bizim zaman uyumsuz sarma o ilgilenir olarak callback parametresi, dışarı bırakılması gerektiğini not rağmen) bakın.

Yani ayrı ayrı onları geçmesi gerekecek: Tabii ki

var result = ordersGroup(
    // keys 
    function(doc) { 
     return { year: doc.createdAt.toISOString().substring(0, 4) }; 
    }, 

    // condition 
    {createdAt: {$lt: new Date("2015-12-31"), $gt: new Date("2015-01-01")}}, 

    // initial 
    {months: {}}, 

    // reduce 
    function(order, result) { 
     var month = order.createdAt.getMonth()+1, 
      date = order.createdAt.getDate(); 

     month = result.months[month] || (result.months[month] = {}); 
     date = month[date] || (month[date] = []); 
     date.push(order); 
    } 
); 

sunucuda bu sadece eserler, bu nedenle tercihen server alt dizinine (yönteminiz sunucu yalnızca kodda olduğundan emin olun, veya bir if (Meteor.isServer)) içinde.

+0

rawCollection() kullanmayı denedim, ancak yine de çalışmıyor. Düzgün kullanıyorum emin değilim. Yanlış yaptığım herhangi bir fikir var mı? (bkz. sorudaki güncelleme) – Jaro

+0

Yanlışlıkla 'wrapAsync 'kullanıyorsunuz,' Meteor.wrapAsync (collection.group, collection)' den (params) ' – user3374348

+0

düzeltmelerden yararlanın, ama maalesef hala hata alıyorum. (Sadece sorumu güncelledim). – Jaro

İlgili konular