2017-10-17 11 views
0

Je suis essayer de faire quelques fonctions mathématiques sur 3 valeurs à partir d'un gauche joint collecté les valeurs sont dans la bonne collection.Mongo addfields retourne la collection pas la valeur

$AllBodies=Invoke-MdbcAggregate @(
    # filter bodies with arsenic 
    @{ '$match' = @{ 
     'name' ='Gru Hypue KS-T d3-31 9 b a' 
     'materials' = @{ '$elemMatch'[email protected]{ 'material_name'="Arsenic" } } 
    }} 
    # list just the name, materials array and FK 
    @{ '$project' = @{ 
     'system_id'=1; 
     'name'=1; 
     'materials'=1; 
    }} 
    # unwind the array, duplicates source record 
    @{ '$unwind' = @{ 
     'path' = '$materials'; 
     'preserveNullAndEmptyArrays' = $false 
    }} 
    # now re-filter the for just the material arsenic/ 
    @{ '$match' = @{ 
     'materials.material_name' = 'Arsenic'; 
     'materials.share'   = @{ '$gte' = 2.7 } 
    }} 
    # sort the records by % arsenic descending 
    @{ '$sort' = @{ 
     'materials.share' = -1 
    }} 
    # left join the systems collection 
    @{ '$lookup' = @{ 
     'from'   = 'systems' 
     'localField' = 'system_id' 
     'foreignField' = 'id' 
     'as'   = 'systems' 
    }} 
    # add fields to work with later - more dev required 
    @{ '$addFields' = @{ 
     'x' = '$systems.x' 
     'y' = '$systems.y' 
     'z' = '$systems.z' 
     'systemname' = '$systems.name' 
    }} 
) -Collection $bodies 

Je suis en train de porter les valeurs d'un niveau dans le document haut que je ne parviens pas à des fonctions mathématiques sur les points champs qui se plaignent de référence.

Dans le document de haut je veux d = sqr ((x1-x2) 2+ (y1-y2) 2+ (z1-z2) 2).

Je suis en train de le faire pendant le temps de requête plutôt que de retraiter l'ensemble de la collection, il y a 100.000 entrées de ce (potentiellement)

Le code est PowerShell avec pilote .net, heureux d'avoir dans .js si

eteint est la suivante ...

Name       Value                                                 
----       -----                                                 
_id       59cbf243ef32b7bbe22654b4                                            
name       Gru Hypue KS-T d3-31 9 b a                                           
system_id      3288878                                                
materials      {material_id, material_name, share}                                         
systems      {{ "_id" : ObjectId("59cba528ef32b7bbe28a7640"), "id" : 3288878, "edsm_id" : 2749852, "name" : "Gru Hypue KS-T d3-31", "x" : -4990.84375, "y" : -935.71875, "z" : 13387.15625, "population" : 1000... 
y        {-935.71875}                                               
systemname      {Gru Hypue KS-T d3-31}                                            
z        {13387.15625}                                               
x        {-4990.84375} 

comme vous pouvez le voir x, y, z sont des collections plutôt que des valeurs

TIA

+0

Veuillez partager quelques exemples de données d'entrée et la sortie désirée ainsi qu'une question appropriée. Qu'essayez-vous exactement d'accomplir? – dnickless

+0

désolé essayé d'être bref ... – RocketAndy

Répondre

0

Si je vous comprends bien, vous aurez besoin de changer simplement votre dernière étape dans:

@{ '$addFields' = @{ 
    'x' = @{ '$arrayElemAt' = @('$systems.x', 0) } 
    'y' = @{ '$arrayElemAt' = @('$systems.y', 0) } 
    'z' = @{ '$arrayElemAt' = @('$systems.z', 0) } 
    'systemname' = '$systems.name' 
}} 

Cela vous donnera la première valeur de chaque tableau seulement.

+0

Ils ne sont pas des tableaux qu'ils seraient entourés de [], ils sont collection {}. Je reçois une erreur "Invoke-MdbcAggregate: Impossible de lier le paramètre 'Pipeline' à la cible Paramètre d'exception" Pipeline ":" Le type .NET System.Management.Automation.ScriptBlock ne peut pas être mappé à un BsonValue. " At line: 2 char: 33 + $ AllBodies = Invoke-MdbcAggregate @ ( + ~~ + CategoryInfo: WriteError: (:) [Invoke-MdbcAggregate], ParameterBindingException + FullyQualifiedErrorId: ParameterBindingFailed, Mdbc.Commands.InvokeAggregateCommand » – RocketAndy

+0

ce sont des tableaux, il est juste le pilote qui les affiche de façon amusante J'ai corrigé la syntaxe ci-dessus dans PowerShell correcte (testé) donc ça devrait fonctionner correctement maintenant. – dnickless