2016-04-14 21 views
2

Dokümanın içindeki bir dizi ve başka bir kullanıcı tanımlı dizi arasındaki kesişimi bulmak için Mongo Toplama Çerçevesini kullanmaya çalışıyorum. Doğru bir sonuç alamıyorum ve tahminim, bir dizinin içinde dizilim olduğu gerçeğidir.Alt tanımlı dizinin kullanıcı tanımlı diziyle kesişme dönüşü mü?

Veri kümem.

My belgeler:

{ 
    "_id" : 1, 
    "pendingEntries" : [ 
     { 
      "entryID" : ObjectId("5701b4c3c6b126083332e65f"), 
      "tags" : [ 
       { 
        "tagKey" : "owner", 
        "tagValue" : "john" 
       }, 
       { 
        "tagKey" : "ErrorCode", 
        "tagValue" : "7001" 
       }, 
       { 
        "tagKey" : "ErrorDescription", 
        "tagValue" : "error123" 
       } 
      ], 
      "entryTime" : ISODate("2016-04-04T00:26:43.167Z") 
     } 
    ] 
}, 

/* 1 */ 
{ 
    "_id" : 2, 
    "pendingEntries" : [ 
     { 
      "entryID" : ObjectId("5701b4c3c6b126083332e65d"), 
      "tags" : [ 
       { 
        "tagKey" : "owner", 
        "tagValue" : "peter" 
       }, 
       { 
        "tagKey" : "ErrorCode", 
        "tagValue" : "6001" 
       }, 
       { 
        "tagKey" : "JIRA", 
        "tagValue" : "Oabc-123" 
       } 
      ], 
      "entryTime" : ISODate("2016-04-04T00:26:43.167Z") 
     } 
    ] 
}, 

/* 2 */ 
{ 
    "_id" : 3, 
    "pendingEntries" : [ 
     { 
      "entryID" : ObjectId("5701b4c3c6b126083332e65c"), 
      "tags" : [ 
       { 
        "tagKey" : "owner", 
        "tagValue" : "abc" 
       }, 
       { 
        "tagKey" : "ErrorCode", 
        "tagValue" : "6001" 
       }, 
       { 
        "tagKey" : "JIRA", 
        "tagValue" : "abc-123" 
       } 
      ], 
      "entryTime" : ISODate("2016-04-04T00:26:43.167Z") 
     } 
    ] 
} 

Benim Sorgu:

db.entrylike.aggregate(
    [ 
    { $project: { "pendingEntries.entryID": 1, "common": { $setIntersection: [ "$pendingEntries.tags", [{ "tagKey" : "ErrorCode", "tagValue" : "7001" }] ] } } } 
    ] 
) 

Sonuç:

{ 
    "result" : [ 
     { 
      "_id" : 1, 
      "pendingEntries" : [ 
       { 
        "entryID" : ObjectId("5701b4c3c6b126083332e65f") 
       } 
      ], 
      "common" : [] 
     }, 
     { 
      "_id" : 2, 
      "pendingEntries" : [ 
       { 
        "entryID" : ObjectId("5701b4c3c6b126083332e65d") 
       } 
      ], 
      "common" : [] 
     }, 
     { 
      "_id" : 3, 
      "pendingEntries" : [ 
       { 
        "entryID" : ObjectId("5701b4c3c6b126083332e65c") 
       } 
      ], 
      "common" : [] 
     } 
    ], 
    "ok" : 1 
} 

Boş olacak ilk ortak alan beklemiyorum. Birisi neyi yanlış yaptığımı bilmeme izin verebilir mi? Ya da yapabileceğim herhangi bir çalışma.

Ben mongodb 3.0.8 kullanıyorum. Mongodb 3.2'nin ihtiyaçlarımızı karşılayacak bazı özellikler sunabileceğinin farkındayım, ancak 3.2 güncellemesi yakında boru hattımızda değil ve mümkünse Mongo3.0 kullanarak bu sorunu çözmek istiyorum.

Amacım, etiketler dizisini kullanıcı tanımlı listeden ortak öğelerle değiştirmek veya ortak öğeler içeren yeni bir alan eklemektir. Benim örneğimde ilerlemeye çalışıyorum.

cevap

2

Genel alanın boş olmasının nedeni, "pendingEntries" dizinizin ve kullanıcı tanımlı dizinin ortak öğe içermemesidir. Gerçekten istediğiniz şey, "etiketler" dizinizde ve kullanıcı tanımlı dizinizde görünen öğeleri içeren bir dizi döndürmektir. Bunu yapmak için $map işlecini kullanabilir ve $setIntersection işlecini "pendingEntries" dizisindeki her bir alt belgeye "etiketler" uygulayabilirsiniz. sadece $ setIntersection` `içeride doğrudan tek unsur dizisi notate herhangi bir sorun oluşturmaz çünkü

{ 
    "_id" : 1, 
    "common" : [ 
     { 
      "entryID" : ObjectId("5701b4c3c6b126083332e65f"), 
      "tags" : [ 
       { 
        "tagKey" : "ErrorCode", 
        "tagValue" : "7001" 
       } 
      ] 
     } 
    ] 
} 
{ 
    "_id" : 2, 
    "common" : [ 
     { 
      "entryID" : ObjectId("5701b4c3c6b126083332e65d"), 
      "tags" : [ ] 
     } 
    ] 
} 
{ 
    "_id" : 3, 
    "common" : [ 
     { 
      "entryID" : ObjectId("5701b4c3c6b126083332e65c"), 
      "tags" : [ ] 
     } 
    ] 
} 
+1

' $ literal' bu bağlamda gerekli edilmemelidir: döndüren

db.entrylike.aggregate([ { "$project": { "common": { "$map": { "input": "$pendingEntries", "as": "p", "in": { "entryID": "$$p.entryID", "tags": { "$setIntersection": [ "$$p.tags", { "$literal": [ { "tagKey" : "ErrorCode", "tagValue" : "7001" } ]} ] } } } } }} ]) 

. Ayrıca, "$ setIntersection" öğesinin yalnızca, öğeler "tam" düzende olduğunda ve "[{" tagValue ":" 7001 "," tagKey ":" ErrorCode "}]' 'notasyonu bu nedenle kullanıldığında burada işe yaramaya değer. "Karşılaştırma veya saklanan verilerin anahtarların sırasına göre olmadığı bir eşleşme. Tabii ki ana unsur, elementlere erişmek ve değiştirilen formu iade etmek için '$ map' kullanmaksa. Hangisi belirtildiği gibi. –

+0

@NeilLunn Aynı zamanda "$ literal" gerekli olmadı, ancak $ $ literal olmadan, sorgu başarısız oldu * "FieldPath 'ErrorCode' $ ile başlamıyor" * – styvane

+0

Bir yazım hatası geçirmiş olmalısınız. db.collection.aggregate ({"$ project": {"a": {"$ setIntersection": [["a", "b"], ["b"]]}}}) 'basit bir yeniden üretilebilir vaka. –