2014-12-19 26 views
10

Bir toplama sorgusunda onaltılı bir dizeyi eşdeğer ObjectID'ye dönüştürmeye çalışıyorum. aşağıdaki yöntemlerden birini kullanarakMongoDB aggregation proje dizesi ObjectId

db.omvas.aggregate([ 
    {$project:{ 
     EID:{$let: { 
       vars: { 
        id: "$EID" 
       }, 
       in: ObjectId("$$id") 
      }}, 
     } 
    }, 
    {$group:{ 
     _id:"$EID" 
     } 
    } 
]); 

ve

db.omvas.aggregate([ 
    {$project:{ 
     EID: ObjectId("$EID") 
     } 
    }, 
    {$group:{ 
     _id:"$EID" 
     } 
    } 
]); 

ben hata almaya devam "uzunluk hatası::: geçersiz nesne kimliği" Ben iki farklı yöntem denedi. Toplama değişkeni yerine bir harf dizisi eklemeyi test ettim ve doğru bir ObjectID ile sonuç aldım. Dize değeri Mongo'nun ObjectId işlevine geçirilmiyor gibi görünüyor, ancak değişken adı bir değişmez dize olarak iletiliyor.

Neyi başarmaya çalışıyorum, bunun mümkün olup olmadığı hakkında bir fikriniz var mı? Eksik olduğum bir sihir var mı?

cevap

3

ObjectId Kabuktaki ObjectIds için bir kurucudur. Eğer

"EID" : { "$let" : { 
      "vars" : { "id" : "$EID" }, 
      "in" : ObjectId("$$id") 
     } } 

gibi bir şey yazdığınızda Mongo kabuk toplama isteğini göndermeden önce ObjectId("$$id") değerlendirir. Bu size ne gerek bir objectId içine bir dize dönüştürmek için bir toplama operatörüdür

var x = 2 
var y = 4 
f(x + y) // f(6) 

gibi JavaScript bir işlevi olarak adlandırılan sadece eğer gibi. Maalesef, MongoDB 2.6'dan itibaren böyle bir işlev yok. Dizeyi niçin dönüştürmeniz gerekiyor? Bununla ne yapacaksın? Belki de toplamada bir dönüşüm operatörünün yokluğunun bir yolu vardır.

+0

Teşekkürler, bu mükemmel bir anlam ifade ediyor. Bu belirli sorgu, raporlama iş akışında yalnızca bir aşamadır. ObjectId, boru hattından aşağıya doğru yapılan sorgulamalar tarafından kullanıldığı için gerekliydi. Şimdi nasıl çalıştıklarını tekrar gözden geçiriyorum ve bunları yürütmenin daha iyi bir yolunun olduğunu düşünüyorum. – StevenWarren

+1

Benim durumumda, yerel alanın bir "ObjectId" dizgesini temsil ettiği ve yabancı alanın gerçek bir ObjectId olduğu bir '$ lookup 'yapmak istiyorum. Bu mümkünse herhangi bir fikir w/MongoDB 3.2? – Madbreaks

+1

Bunun bir yolu, koleksiyondaki belgelere ObjectId olarak kimliği içeren yeni bir alan ekleyen bir komut dosyası yazmak olacaktır. Ardından yeni alanı kullanarak $ lookup yapın. –

İlgili konular