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_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb 如何在mongo中检查同一文档中的两个值?

Mongodb 如何在mongo中检查同一文档中的两个值?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有以下数据结构- { "_id" : ObjectId("5462f7c2e4b01e902fe359f9"), "runtime" : 1415772003908, "myInfo" : [ { "name" : "AAA", "uuid" : "42089c2d-e3db-14e7-d427-d020881c4820", "canName" : [ "naa.60a9800042704577762b456

我有以下数据结构-

{
"_id" : ObjectId("5462f7c2e4b01e902fe359f9"),
"runtime" : 1415772003908,
"myInfo" : [ 

    {
        "name" : "AAA",
        "uuid" : "42089c2d-e3db-14e7-d427-d020881c4820",
        "canName" : [ 
            "naa.60a9800042704577762b45634476337a", 
            "naa.6d867d9c7acd60001aed76eb2c70bd53", 
            "naa.600a09804270457a7a5d455448735330"
        ]
    }, 
    {
        "name" : "BBB",
        "uuid" : "4208b252-5cab-fa1f-7e2e-449a7884c82b",
        "canName" : [ 
            "naa.6d867d9c7acd60001aed76eb2c70bd53"
        ]
    }, 

],
"ds" : [ 
    {
        "luns" : {
            "model" : "Virtual CD/DVD",
            "canName" : "mpx.vmhba32:C0:T0:L0",
            "vendor" : "Linux"
        },
        "vms" : []
    }, 
    {
        "name" : "name1",
        "utilization" : {
            "freeBytes" : 106087579648,
            "sizeBytes" : 107105746944,
            "usedBytes" : 1018167296
        },
        "luns" : {
            "model" : "LUN",
            "canName" : "naa.60a9800032466774352446525768457a",
            "vendor" : "abc"
        },
        "vms" : []
    }, 
    {
        "name" : "name2",
        "utilization" : {
            "freeBytes" : NumberLong(4352638976),
            "sizeBytes" : NumberLong(5100273664),
            "usedBytes" : NumberLong(747634688)
        },
        "luns" : {
            "model" : "LUN",
            "canName" : "naa.60a9800042704577762b456344763376",
            "vendor" : "NETAPP"
        },
        "vms" : [],
        "diskWriteBytes" : 0,
        "diskReadBytes" : 0
    }, 
    {
        "luns" : {
            "model" : "LUN",
            "canName" : "naa.60a98000324667743524465257684631",
            "vendor" : "NETAPP"
        },
        "vms" : []
    }, 
    {
        "name" : "name3",
        "utilization" : {
            "freeBytes" : NumberLong(7191134208),
            "sizeBytes" : NumberLong(11542724608),
            "usedBytes" : NumberLong(4351590400)
        },
        "luns" : {
            "model" : "LUN",
            "canName" : "naa.60a9800042704577762b45634476337a",
            "vendor" : "NETAPP"
        },
        "vms" : [ 
            "BBB"
        ]
    }, 
    {
        "name" : "name4",
        "utilization" : {
            "freeBytes" : NumberLong(550533857280),
            "sizeBytes" : NumberLong(998848331776),
            "usedBytes" : NumberLong(448314474496)
        },
        "luns" : {
            "model" : "MRSASRoMB-4i",
            "canName" : "naa.6d867d9c7acd60001aed76eb2c70bd53",
            "vendor" : "LSI"
        },
        "vms" : [ 
            "AAA", 
            "BBB", 
            "CCC", 
            "DDD"
        ],
        "diskWriteBytes" : 0,
        "diskReadBytes" : 8
    }
]
}
我想将ds中LUN中的canName与myinfo中的canName阵列进行匹配,并且myinfo中的名称出现在ds的虚拟机中。通过匹配,我想从这两个字段中得到以下字段

从ds-名称、利用率、diskReadBytes、diskWriteBytes

来自vms-名称、uuid、canName

所以我的输出将是-

[{
        "name" : "AAA",
        "uuid" : "42089c2d-e3db-14e7-d427-d020881c4820",
        "canName" :"naa.6d867d9c7acd60001aed76eb2c70bd53", 
       "dsname" : "name3",
        "utilization" : {
            "freeBytes" : NumberLong(550533857280),
            "sizeBytes" : NumberLong(998848331776),
            "usedBytes" : NumberLong(448314474496)
        },
        "luns" : {
            "model" : "MRSASRoMB-4i",
            "canonicalName" : "naa.6d867d9c7acd60001aed76eb2c70bd53",
            "vendor" : "LSI"
        }
    }, 
    {
        "name" : "BBB",
        "uuid" : "4208b252-5cab-fa1f-7e2e-449a7884c82b",
        "canName" :"naa.60a9800042704577762b45634476337a",
    "dsname" : "name3",
        "utilization" : {
            "freeBytes" : NumberLong(7191134208),
            "sizeBytes" : NumberLong(11542724608),
            "usedBytes" : NumberLong(4351590400)
        },
        "luns" : {
            "model" : "MRSASRoMB-4i",
            "canonicalName" : "naa.60a9800042704577762b45634476337a",
            "vendor" : "LSI"
        }

    }]

当然可以。由于要在数组中进行匹配,所以这不是非常简单。但这类事情在以下情况下是可能的:

db.collection.aggregate([
//展开每个数组以“反规范化”所有内容
{“$unwind”:“$myInfo”},
{“$unwind”:“$myInfo.canName”},
{“$unwind”:“$ds”},
//使用两个字段匹配的测试进行项目
{“$project”:{
“\u id”:“$$ROOT”,
“匹配”:{
“$eq”:[
“$myInfo.canName”,
“$ds.luns.canName”
]
}
}},
//过滤掉所有不匹配的内容
{“$match”:{“matched”:true},
//投影到所需的字段结构
{“$project”:{
“_id”:0,
“名称”:“$\u id.myInfo.name”,
“uuid”:“$\u id.myInfo.uuid”,
“canName”:“$\u id.myInfo.canName”,
“dsname”:“$\u id.ds.name”,
“利用率”:“$\u id.ds.utilization”,
“LUN”:“$\u id.ds.luns”
}}
])
使用MongoDB 2.6中介绍的方法,避免在测试两个字段匹配情况的投影中再次列出所有字段名。如果您想要或使用较低版本,您也可以传统地列出所有字段

您可能还想考虑使用来自MunGoDB 2.6的内联处理来做这件事,如果您的数组可能相当大,则更大:

db.collection.aggregate([
{“$project”:{
“_id”:0,
“我的信息”:{
“$map”:{
“输入”:“$myInfo”,
“as”:“info”,
“在”:{
“名称”:“$$info.name”,
“uuid”:“$$info.uuid”,
“canName”:{
“$setDifference”:[
{“$map”:{
“输入”:“$$info.canName”,
“作为”:“ican”,
“在”:{
“$setDifference”:[
{“$map”:{
“输入”:“$ds”,
“as”:“ds”,
“在”:{
“$cond”:[
{“$eq”:[
“$$ican”、“$$ds.luns.canName”
]},
{ 
“canName”:“$$ican”,
“dsname”:“$$ds.name”,
“利用率”:“$$ds.utilization”,
“LUN”:“$$ds.LUN”
},
假的
]
}
}},
[错误]
]
}                      
}},
[错误]
]
}
}
}
}
}},
{“$unwind”:“$myInfo”},
{“$unwind”:“$myInfo.canName”},
{“$unwind”:“$myInfo.canName”},
{“$project”:{
“名称”:“$myInfo.name”,
“uuid”:“$myInfo.uuid”,
“canName”:“$myInfo.canName.canName”,
“dsname”:“$myInfo.canName.dsname”,
“利用率”:“$myInfo.canName.utilization”,
“LUN”:“$myInfo.canName.luns”
}}
])
每种情况下的原则都是一样的。基本上,这会对数组的每个成员进行比较,以查看匹配的位置。将相似匹配放在一起,并在没有匹配的地方“过滤”出来,返回最终结果

我实际上得到了与“AAA”元素的“两个”匹配,因为它的“canName”数组有两个元素与“ds”数组中的元素匹配:

{
“名称”:“AAA”,
“uuid”:“42089c2d-e3db-14e7-d427-d020881c4820”,
“canName”:“naa.60a9800042704577762b45634476337a”,
“dsname”:“name3”,
“利用率”:{
“freeBytes”:NumberLong(“7191134208”),
“sizeBytes”:数字长(“11542724608”),
“usedBytes”:数字长度(“4351590400”)
},
“LUN”:{
“模型”:“LUN”,
“canName”:“naa.60a9800042704577762b45634476337a”,
“供应商”:“NETAPP”
}
}
{
“名称”:“AAA”,
“uuid”:“42089c2d-e3db-14e7-d427-d020881c4820”,
“canName”:“naa.6D867D9C7ACD6001AED76EB2C70BD53”,
“dsname”:“name4”,
“利用率”:{
“freeBytes”:NumberLong(“550533857280”),
“sizeBytes”:数字长(“998848331776”),
“usedBytes”:数字长度(“448314474496”)
},
“LUN”:{
“型号”:“MRSASRoMB-4i”,
“canName”:“naa.6D867D9C7ACD6001AED76EB2C70BD53”,
“供应商”:“LSI”
}
}
{
“名称”:“BBB”,
“uuid”:“4208b252-5cab-fa1f-7e2e-449a7884c82b”,
“canName”:“naa.6D867D9C7ACD6001AED76EB2C70BD53”,
“dsname”:“name4”,
“利用率”:{
“freeBytes”:NumberLong(“550533857280”),
“sizeBytes”:数字长(“998848331776”),
“usedBytes”:数字长度(“448314474496”)
},
“LUN”:{
“型号”:“MRSASRoMB-4i”,
“canName”:“naa.6D867D9C7ACD6001AED76EB2C70BD53”,
“供应商”:“LSI”
}
}

您可以使用“name”和“uuid”字段作为分组键,交替地将最后一个字段更改为a,然后在所有其他投影字段上使用运算符,以便仅保留“first”匹配。但这取决于你的意图。

如果没有
$unwind
,这可能吗?@yogesh最终不可能。第二个示例不使用
$unwind
进行任何“匹配或比较”,因为所有这些工作都是使用
$map
在文档“内部”处理的。
$unvi