我有一个有趣的用例,我正在使用它需要我在两个数组类型上应用Mongo的$ unwind运算符(这是mongo文档中的一个属性)
这是一个我希望过滤2个枚举类型的例子 $ host.config.storageDevice.scsiLun - enum(“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 }} )
OR
我可以将复合聚合操作单元的结果链接到另一个聚合单元
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 }}