MongoDB数组对象的投影,仅获取匹配的对象

4
我有一个像这样的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"
        }
    ]
}

我想找到产品代码为ABC和货币代码为USD的文档,这些文档在走廊数组中。如何仅从corridors数组返回匹配的对象?例如,仅当结果中包含USDcurrencyCode的对象时才出现,而不是整个数组。
我尝试运行此查询{ productCode: 'ABC', corridors: { $elemMatch: { currencyCode: "USD"}}}。但它给我返回整个数组,而不是只有匹配的元素。

请查阅以下文档:https://docs.mongodb.com/manual/reference/operator/projection/elemMatch/ 在投影中使用 $elemmatch。 - Krishna
我已经在使用$elemmatch。 - Waqar Azhar
1
use it in projection - Krishna
1个回答

2

我认为你不能在$project中使用$elemMatch。查看这个链接

尝试以下查询:

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。希望这可以帮助您!

1
你的想法是错误的。$elemMatch操作符有两种形式,一种用于查询,另一种(链接的那个)用于投影。虽然这个问题已经被解决了,但是使用$filter$unwind更可取,因为有很多原因可以进行“多重匹配”。但是对于“单个”匹配结果,只需要标准的$elemMatchposition $ operator就足够了。 - Neil Lunn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接