2016-03-17 14 views
13

Yanıt olarak ObjectId yerine bir dize almak için toplama işlevinde kullanabileceğim bir işleç var mı?

db.something.aggregate([ {$match: {'property': {$exists:true}} }, {$project: {stringId: '$_id.???'}}]) 
+2

Hayır yok. Toplama çerçevesi, herhangi bir veri türünü ("$ substr" ile sayısal dizeden ve sayısal ile Tarih veya Tarihe sayısal olarak temelde hile ile mümkündür) yeniden yayınlamaz. Neden bunun gerekli olduğunu düşünüyorsun? Çoğu dilde 'ObjectId 'değerini bir dize olarak yazmak oldukça basittir. –

+1

@BlakesSeven Her zaman neden vardır :) Çünkü basitlikten. Tabii ki işlem yapabilirsin. Ama sonucu basit bir dize gerektiren başka bir hizmet/partiye aktarabilseydim hoş olurdu. ... – matus

+1

Söylediğim gibi, çoğu dil ile BSON sadece yerel türlere dökülüyor. Ve "çoğu" diller için, sadece bir ip olarak çıktısını almak için hiç bir çalışma yapılmaz. Şahsen ben genişletilmiş JSON çıkış formu i.e '{" $ oid ":" 56ea9e8bb1e015d13b376db5 "}' yi tercih ediyorum, çünkü en azından, uzaktaki bir istemcinin, verilerin gerçekten bir 'ObjectId' olduğunu bilmesini sağlayarak, kendisini doğru bir şekilde ayrıştırabilir ve doğru bir şekilde yayınlayabilir. Bu iyi bir şey, özellikle de depolama alanının dize uzunluğunun yarısı ** olduğunu düşünürsek. –

cevap

6

ObjectId'den String almak için birleştirme işlevinde Doğrudan İşleç yoktur.

Sürüm 2.6'dan sonra ObjectId'inizi string'e dönüştürmek için ObjectId.toString() yöntemini kullanabilirsiniz. İlk önce ObjectID'nizi eşleştirin ve projelendirin. Daha sonra bu nesne kimliğini ObjectID.toString() kullanarak dizeye dönüştürebilirsiniz.

db.something.aggregate([{"$match":{'property': {$exists:true}}},{"$project":{"_id":1}}]) 

Ve sonra Object çıkan kullanıp ObjectID.tostring()

düzenleme kullanarak tepki olarak dize olsun: Sen

ObjectId("507f191e810c19729de860ea").str

kullanarak nesne id str niteliğini erişebilir Kaynak: mongodb docs

-11

satır içi $concat operatörünü kullanarak bunu yapabilirsiniz:

db.something.aggregate(
    [ 
     { $match : 
      { 'property' : 
       { $exists:true } 
      } 
     }, 
     { $project: 
      { stringId: 
       { $concat: [ ObjectId().str ] } 
      } 
     } 
    ] 
) 
+0

Benim için bu, kaydın ObjectId "stringId" yapmaz. Yepyeni bir ObjectId'nin sıkı bir versiyonunu yapar. Özellikle, geri gönderilen tüm belgeler için aynı değerdir. Yani bunun doğru olduğunu düşünmüyorum. – mcdave