2014-08-28 24 views
14

İlk olarak, mongodb için oldukça yeni. İşte benim sorum şu ki bir çözüm bulamadım.Tüm Mongo koleksiyonlarına gidin ve sorguyu çalıştırın

Diyelim ki 3 farklı koleksiyonum var.

mongos> show collections 
collectionA 
collectionB 
collectionC 

Ben bu veritabanındaki ind tüm koleksiyonları üzerinde dolaşır bir komut dosyası oluşturmak ve bu koleksiyonların her geçen sokulan zaman damgası bulmak istiyorum. Burada mongosun içinde ne var.

var last_element = db.collectionA.find().sort({_id:-1}).limit(1); 
printjson(last_element.next()._id.getTimestamp()); 
ISODate("2014-08-28T06:45:47Z") 

1. Sorunu (bütün koleksiyonları üzerinde Bıkmadan)

sth için olasılığı var mıdır. sevmek.

var my_collections = show collections; 
my_collections.forEach(function(current_collection){ 
    print(current_collection); 
}); 

burada Problem my_collections için atama çalışmaz. SyntaxError: Unexpected identifier'u alırım. 'Şov' ifadesini alıntılamak zorunda mıyım? Bu mümkün mü?

2. sorun

Bunu yaparak Problem 1 geçici çözüm olabilir (js var koleksiyonu saklama):

error hasNext: false at src/mongo/shell/query.js:124

: last_element.next() aşağıdaki hata üretir

var my_collections = ["collectionA", "collectionB", "collectionC"]; 
my_collections.forEach(function(current_collection){ 
    var last_element = db.current_collection.find().sort({_id:-1}).limit(1); 
    print(current_collection); 
    printjson(last_element.next()._id.getTimestamp()); 
}); 

Last_element öğesinin doğru kaydedilmemiş gibi görünüyor.

Yanlış yaptığım şeylerle ilgili herhangi bir öneriniz var mı?


GÜNCELLEME

Neils cevabı bu çözümün bana yol. Koduna ek olarak, getTimestamp işlevinin gerçekten var olup olmadığını kontrol etmek zorunda kaldım. Bazı 'sanal' koleksiyonlar için _id özelliği yok gibi görünüyor.

db.getCollectionNames().forEach(function(collname) { 
    var last_element = db[collname].find().sort({_id:-1}).limit(1); 
    if(last_element.hasNext()){ 
     var next = last_element.next(); 
     if(next._id !== undefined && typeof next._id.getTimestamp == 'function'){ 
      printjson(collname + " >> "+next._id.getTimestamp()); 
     }else{ 
      print(collname + " undefined!! (getTimestamp N/A)") 
     } 
    } 
}); 
+1

Sadece açıklığa kavuşturmak için. .getTimeStamp() 'un başarısız olmasının tek nedeni, her belgede birincil anahtar' _id 'alanında aslında bir 'ObjectId' bulunmamasıdır. ** buna gerçekten değinmelisiniz, çünkü MongoDB, "şema" olduğu için alanları "karıştırmanıza" izin vermiş gibi, ** siz bunu genel bir uygulama olarak yapmamalısınız ve gerçekten bunu düzeltmelisiniz. Bu girişleri tutarlı hale getirmek için nerede oluşur. –

+0

Bu bildirim için teşekkürler! Belirtildiği gibi mongo için oldukça yeni ve ilişkisel bir db arka plandan geliyorum. Bu koleksiyonların nasıl oluşturulduğunu veya neden hiçbir ObjectID değerinin olmadığından emin değilim. Sizin de belirttiğiniz gibi bunu düzeltmem gerekecek ve neden ve nasıl olduğunu anlamanız gerekecek. Teşekkürler! – cb0

cevap

25

sizin için yapar db.getCollectionNames() yardımcı yöntem yoktur. Muhtemelen orada da bir .hasNext() onay olası boş koleksiyonları için hitap istediğiniz

db.getCollectionNames().forEach(function(collname) { 
    // find the last item in a collection 
    var last_element = db[collname].find().sort({_id:-1}).limit(1); 
    // check that it's not empty 
    if (last_element.hasNext()) { 
     // print its timestamp 
     printjson(last_element.next()._id.getTimestamp()); 
    } 
}) 

: Daha sonra kod uygulayabilir.

+0

Bunun, tüm aramaların senkron olduğu kabuk ortamında gerçekten sadece güvenli olduğunu söyleyebilirim; Bu çözüm, asenkron sürücü ortamında risklidir (hızlı ardışık olarak birçok paralel sorgu). – zamnuts

+0

@zamnuts Async ortamında listeler ve veri akışlarını güvenli bir şekilde işlemenin birçok yolu vardır. Her yinelemeyi duyurmak için geri bildirimlerin farkında olmanız yeterlidir. Bundan emin değilseniz, her zaman bir soru sorabilir ve birileri size nasıl yapılacağını gösterecektir. –

+0

bu benim için işe yaramıyor: 'Tanımlanamayan 'bulmak' yöntemi aranamıyor ... ' mongo version 2.6.6 –