MongoDb投影在对象数组上,仅获取匹配对象

时间:2018-06-13 20:23:30

标签: arrays mongodb mongodb-query

我有像这样的mongo文件

{
    "_id": "5b14679e592baa493e0bc208",
    "productCode": "ABC",
    "corridors": [
        {
            "countryNameEn": "Sweden",
            "countryNameFr": "Suède",
            "countryCode": "SE",
            "currencyNameEn": "Swedish Krona",
            "currencyNameFr": "Couronne suédoise",
            "currencyCode": "SEK",
            "corridorLimit": "abc"
        },
        {
            "countryNameEn": "USA",
            "countryNameFr": "Suède",
            "countryCode": "US",
            "currencyNameEn": "USA",
            "currencyNameFr": "Couronne suédoise",
            "currencyCode": "USD",
            "corridorLimit": "abc"
        }
    ]
},
{
    "_id": "5b14679e592baa493e0bc208",
    "productCode": "XYZ",
    "corridors": [
        {
            "countryNameEn": "Sweden",
            "countryNameFr": "Suède",
            "countryCode": "SE",
            "currencyNameEn": "Swedish Krona",
            "currencyNameFr": "Couronne suédoise",
            "currencyCode": "SEK",
            "corridorLimit": "abc"
        },
        {
            "countryNameEn": "USA",
            "countryNameFr": "Suède",
            "countryCode": "US",
            "currencyNameEn": "USA",
            "currencyNameFr": "Couronne suédoise",
            "currencyCode": "USD",
            "corridorLimit": "abc"
        }
    ]
}

我想在走廊数组中找到productCodeABCcurrencyCodeUSD的文档。如何仅返回corridors数组中的匹配对象,就像只有USD currencyCode的对象应该出现在结果而不是所有数组中一样。

我尝试运行此查询{ productCode: 'ABC', corridors: { $elemMatch: { currencyCode: "USD"}}}。但它给了我整个数组,而不是唯一匹配的元素。

1 个答案:

答案 0 :(得分:1)

我认为你不能在$ project中使用$ elemMatch。查看this

尝试以下查询:

db.collection.aggregate([
{

    $match : {"productCode" : "ABC"}
}, 
{
    $unwind : "$corridors"
}, 
{
    $match : { "corridors.currencyCode" : "USD"}
}, 
{
    $group : {
              _id : "$productCode", 
              corridors : {$addToSet : "$corridors"}
}
}]);

输出:

{
    "_id" : "ABC",
    "corridors" : [ 
        {
            "countryNameEn" : "USA",
            "countryNameFr" : "Suède",
            "countryCode" : "US",
            "currencyNameEn" : "USA",
            "currencyNameFr" : "Couronne suédoise",
            "currencyCode" : "USD",
            "corridorLimit" : "abc"
        }
    ]
}

在结果中,您将_id而不是productCode。如果您仍然需要productCode,则最后可以包含$project

希望这有帮助!

相关问题