2016-03-28 20 views
2

'dan iki dizinin aynı anda çözünmesi Kaşık İçinde mongoDB Giriş adımını kullandım. Formun belirli bir dokümandaki ..PDI: MongoDB

{"Number": [ 
    "4700100004" 
], 
"Random": [ 
    "unknown" 
], 
"List_Of_Vals1": [ 
    "3", 
    "2", 
    "1", 
], 
"List_Of_Vals2": [ 
    "1", 
    "2", 
    "3", 
]} 

için ben üretir ::

Number  Random List_Of_Vals1 List_Of_Vals2 
"4700100004" "unknown" "3"    ["1","2","3"] 
"4700100004" "unknown" "2"    ["1","2","3"] 
"4700100004" "unknown" "1"    ["1","2","3"] 

Ama sonuçta ben PDI

[{"$unwind":"$List_Of_Vals1"}] 

den Mongo sorgusu kullanarak dizilerin birini dinlenmek mümkün duyuyorum her iki dizinin ardışık olarak,

[{"$unwind":"$List_Of_Vals1"},{"$unwind":"$List_Of_Vals2"}] 
yazarak yapabileceğimi düşündüğüm Herhangi Yardım çok takdir edilir

Number  Random List_Of_Vals1 List_Of_Vals2 
"4700100004" "unknown" "3"    "1" 
"4700100004" "unknown" "2"    "2" 
"4700100004" "unknown" "1"    "3" 

:

ama bu ne nasıl anlamaya görünüyor olamaz gibi çoğaltılması olmadan hem açılmakta "List_Of_Vals1"

Number  Random List_Of_Vals1 List_Of_Vals2 
"4700100004" "unknown" "3"    "1" 
"4700100004" "unknown" "3"    "2" 
"4700100004" "unknown" "3"    "3" 
... 
... 
... 

bir tekrarını döndürür. Teşekkürler

cevap

1

Bunu elde etmek için Mongo 3.2'de tanıtılan $unwind için includeArrayIndex seçeneğini kullanabilirsiniz. $unwind işlemiyle çıkarılan her belge için dizi dizinini tutan yeni bir alan ekler.

$project ve $match aşamalarında bu alanları kullanabilirsiniz, böylece çıktılar doğru altkümelere, yani dizinlerin eşleştiği yerlere süzülür. Her iki diziler büyük olabilir eğer sınırlar sorun haline çalışabilir böylece büyüklüğü n 2 diziler gevşemeden n x n sonuçlar getireceğini

db.test.aggregate([ 
    { $unwind: { path: "$List_Of_Vals1", includeArrayIndex : "index1" } }, 
    { $unwind: { path: "$List_Of_Vals2", includeArrayIndex : "index2" } }, 
    { $project: { 
     _id : 1, 
     Number: 1, 
     Random: 1, 
     List_Of_Vals1: 1, 
     List_Of_Vals2: 1, 
     valid: { $eq: ["$index1", "$index2"] } } 
    }, 
    { $match: { valid: true } } 
]); 

Not.

$zip operator için daha iyi bir çözüm sunması gereken yeni bir özellik var.