Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 在Mongo聚合框架中管道化多个展开_Mongodb_Mongoid - Fatal编程技术网

Mongodb 在Mongo聚合框架中管道化多个展开

Mongodb 在Mongo聚合框架中管道化多个展开,mongodb,mongoid,Mongodb,Mongoid,我有一个有趣的用例,我正在处理这个用例,它要求我在两种数组类型上应用Mongo的$unwind操作符(这是Mongo文档中的一个属性) 下面是一个示例,我希望对2种枚举类型进行筛选 $host.config.storageDevice.scsiLun-枚举(“ssd”、“disk1”、“disk2”) $host.config.storageDevice.scsiLun.capacity.block-范围(1000-100000) 我可以在单个聚合管道中释放多个运算符并对其进行筛选吗

我有一个有趣的用例,我正在处理这个用例,它要求我在两种数组类型上应用Mongo的$unwind操作符(这是Mongo文档中的一个属性)

下面是一个示例,我希望对2种枚举类型进行筛选 $host.config.storageDevice.scsiLun-枚举(“ssd”、“disk1”、“disk2”) $host.config.storageDevice.scsiLun.capacity.block-范围(1000-100000)

我可以在单个聚合管道中释放多个运算符并对其进行筛选吗

               db["XXXXXXX"].aggregate( { $unwind : { "$host.config.storageDevice.scsiLun", "$host.config.storageDevice.scsiLun.capacity.block" } }, 
                               { $match : { "host.config.storageDevice.scsiLun.lunType" : "cdrom"  , "host.config.storageDevice.scsiLun.capacity.block" : { $gte : 60000 } , "managedObject" : "host" } } , 
                               { $project : { "host.name" : 1 , "host.config.storageDevice.scsiLun.devicePath" : 1 , "host.config.storageDevice.scsiLun.capacity.blockSize" : 1 , "host.config.storageDevice.scsiLun.capacity.block" : 1 , "host.config.storageDevice.scsiLun.ssd" : 1 , "host.config.storageDevice.scsiLun.uuid" : 1 , "host.config.storageDevice.scsiLun.lunType" : 1 , "_id" : 0  }} )

我可以将复合聚合操作单元的结果链接到另一个聚合单元吗

               db["XXXXXXX"].aggregate( { $unwind : "$host.config.storageDevice.scsiLun" }, 
               { $match : { "host.config.storageDevice.scsiLun.lunType" : "cdrom"  , "managedObject" : "host" } } , 
               { $project : { "host.name" : 1 , "host.config.storageDevice.scsiLun.devicePath" : 1 , "host.config.storageDevice.scsiLun.capacity.blockSize" : 1 , "host.config.storageDevice.scsiLun.capacity.block" : 1 , "host.config.storageDevice.scsiLun.ssd" : 1 , "host.config.storageDevice.scsiLun.uuid" : 1 , "host.config.storageDevice.scsiLun.lunType" : 1 , "_id" : 0  }},
               { $unwind : "$host.config.storageDevice.scsiLun.capacity.blockSize" },
               { $match : { "host.config.storageDevice.scsiLun.capacity.blockSize" : { $gte : 8000000 } } },
               { $project : { "host.name" : 1 , "host.config.storageDevice.scsiLun.devicePath" : 1 , "host.config.storageDevice.scsiLun.capacity.blockSize" : 1 , "host.config.storageDevice.scsiLun.capacity.block" : 1 , "host.config.storageDevice.scsiLun.ssd" : 1 , "host.config.storageDevice.scsiLun.uuid" : 1 , "host.config.storageDevice.scsiLun.lunType" : 1 , "_id" : 0  }} 

我不确定是否理解您的问题:Mongo aggregate接受double$unwind stages来创建笛卡尔产品。你的两个命题在我看来都不错(当然我没有逐字核对)。试一下,如果不起作用,请回来。我试了第一个,但它不起作用!我是否可以有多个属性的unwind,即此语法是否有效$unwind:{“$host.config.storageDevice.scsiLun”,“$host.config.storageDevice.scsiLun.capacity.block”}…我不确定是否可以将它们直接放在一起。对于双重展开,您需要两个不同的阶段,如:db.somthing.aggregate([{$unwind:$firstArrayKey},{$unwind:$secondArayKey},管道的其他阶段];这样就得到了笛卡尔积。假设你有一套裤子,每个文件的格式为{pant_name:“the name”,colors:[可用颜色数组],size:[可用大小数组]}双解将为你提供每种颜色和单个大小的文档。谢谢你的详细建议。。在我尝试之后,我会和你一起转回来。。。再次感谢另一个问题:是否必须以指定的格式链接管道,如$unwind->$match->$project->$unwind->$match->$project,或者我是否可以像此$unwind->$unwind->$match->$project一样串联应用双解卷