2017-10-17 114 views
0

我试图做一些数学函数的3个值从左边加入收集的值是在正确的集合。Mongo addfields返回集合没有值

$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 

我想把值提高到顶级文档的水平,因为我有抱怨点引用字段的数学函数的麻烦。

在上面的文档中,我想d = sqr((x1-x2)2+(y1-y2)2+(z1-z2)2)。

我试图在查询时要做到这一点,而不是重新处理整个集合,有10万名的条目(潜在的)

的代码在PowerShell和.NET驱动的,高兴有在.js文件虽然

出认沽如下:...

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} 

正如你所看到的x,y,z是收藏,而不是值

TIA

+0

请分享一些样本输入数据和期望的输出以及一个正确的问题。你究竟想达到什么目的? – dnickless

+0

抱歉试图简要... – RocketAndy

回答

0

如果我理解正确的话,您将需要简单地改变你的最后一个阶段为:

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

这会给你只有每个数组的第一个值。

+0

它们不是数组,它们将被封入[],它们是集合{}。我得到错误“Invoke-MdbcAggregate:无法将参数'Pipeline'绑定到目标。例外设置”Pipeline“:”.NET类型System.Management.Automation.ScriptBlock无法映射到BsonValue“ 在行:2 char: 33 + $ AllBodies =调用-MdbcAggregate @( + ~~ + CategoryInfo:WriteError:(:) [调用-MdbcAggregate],ParameterBindingException + FullyQualifiedErrorId:ParameterBindingFailed,Mdbc.Commands.InvokeAggregateCommand” – RocketAndy

+0

他们的阵列,它只是以有趣的方式显示它们的驱动程序。我将上述语法修正为正确的powershell(已测试),因此它现在应该可以正常工作。 – dnickless