2016-05-26 14 views
13

Mongo'da içinde String objectIddönüştürme Şu anda bu senaryoda olduğum Toplama

{ 
    _id:ObjectId('56edbb4d5f084a51131dd4c6'), 
    userRef:ObjectId('56edbb4d5f084a51131dd4c6'), 
    serialNumber:'A123123', 
    ... 
} 

Ben userRef + SERIALNUMBER bunları gruplandırarak, tüm belgeleri toplamak gerekir, bu yüzden 'böyle concat kullanmaya çalışıyorum:

Yani temelde MongoDB benim toplam almada
$group: { 
     _id: { 
      '$concat': ['$userRef','-','$serialNumber'] 
     }, 
     ... 

, bir objectId ve bir dize sıralanmasıyla grup belgeler gerekir.

uncaught exception: aggregate failed: { 

    "errmsg" : "exception: $concat only supports strings, not OID", 
    "code" : 16702, 
    "ok" : 0 
} 

bir toplanma ifadesi içinde bir String bir objectId dönüştürmek için bir yolu var mı: Ancak, $ concat sadece parametre olarak dizeleri kabul ettiğini görünüyor?

DÜZENLEME:

Bu question ilişkilidir, ancak çözüm sorunumu uymuyor. (Özellikle toplama sırasında ObjectId.toString() yöntemini kullanamadığım için)

Gerçekten de Mongo'nun belgelerinde herhangi bir ObjectId(). ToString() işlemi bulamadım, ancak herhangi bir sorun olup olmadığını merak ediyorum. bu durumda yapılmalı.

+0

Belki '_id: [$ userRef, $ serialNumber]' çalışır? Sana bir ip vermeyecek. –

cevap

6

İstediğim şeyi yapmanın bir yolunu bulamadım, bunun yerine, sonunda, anahtarları istediğim şekilde oluşturduğum bir MapReduce işlevi oluşturdum (diğer anahtarları birleştirerek). Sen $substrhttps://docs.mongodb.com/manual/reference/operator/aggregation/substr/#exp._S_substr$concat önce dizeye herhangi bir nesne döküm için kullanabileceğiniz

db.collection('myCollection').mapReduce(
    function() { 
     emit(
      this.userRef.str + '-' + this.serialNumber , { 
       count: 1, 
       whateverValue1:this.value1, 
       whateverValue2:this.value2, 
       ... 
      } 
     ) 
    }, 
    function(key, values) { 
     var reduce = {} 
     .... my reduce function.... 
     return reduce 
    }, { 
     query: { 
      ...filters_here.... 
     }, 
     out: 'name_of_output_collection' 
    } 
); 
+1

Lütfen yazdığınız kodun ne olduğunu söyler misiniz? –

+2

@SudhanshuGaur, bunun yardımcı olup olmadığına bakın. Yorumu düzenledim –

+0

Cevabınız için teşekkür ederim aslında toplama ve harita hakkında bir şeyler okuyordum ve bu haritayı azalttığını bulduğumda bulduğum daha sonra daha yavaş olacağını söyleyeceğim agregasyon thatisy, eğer bunu yapmak istiyorsanız bunu daha iyi olurdu agregation. –

-1

: Sonunda

, şöyle bir şey görünüyordu.

Bu, benim için çalışan bir kod örneğidir.

group_id_i['_id'] = { 
    '$concat' => [ 
     { '$substr' => [ {'$year' => '$t'}, 0, -1] }, '-', 
     { '$substr' => [ {'$month' => '$t'}, 0, -1] }, '-', 
     { '$substr' => [ {'$dayOfMonth' => '$t'}, 0, -1] } 
    ] 
} 

t tarih saat alanı, yani gibi bu çekiş veri döndürür.

{ 
    "_id" => "28-9-2016", 
    "i" => 2 
} 
+0

$ substr tarihte çalışıyor gibi görünüyor, ancak ObjectId çalışmıyor – rrrr

0

İkinizin de alanları içeren bir Array kullanarak çözmeye çalışabilir düşünüyorum:

{$project:{newkey:['$userRef','$serialNumber']},{$match:{newkey:{$in:filterArray}}}} 

bu filtreye iki alana veri eşleşebilir. Lütfen, newkey dizisindeki verilerin, filterArray öğeleriyle aynı veri türüne sahip olduğunu unutmayın.