使用Mongo聚合($lookup)查询中的数组第一个字段进行匹配文档

6

我希望使用数组字段的第0个值,在Mongo聚合$lookup查询中查找匹配的销售文档。这是我的查询:

db.products.aggregate([ 
{ 
    $match : { _id:ObjectId("57c6957fb190ecc02e8b456b")  }  
},
{
    $lookup : {
        from : 'sale',
        localField: 'categories.0', 
        foreignField: 'saleCategoryId', 
        as : 'pcSales'  
    }
}]);

结果:

{
"_id" : ObjectId("57c6957fb190ecc02e8b456b"),   
"categories" : [
    "57c54f0db190ec430d8b4571"
],  
"pcSales" : [
    {
        "_id" : ObjectId("57c7df5f30fb6eacb3810d1b"),                       
        "Title" : "Latest Arrivals",
    }
]}

这个查询会返回一个匹配项,但是当我检查时发现它不匹配。我不知道为什么会发生这种情况,而且当我从查询中删除第0部分时,它返回一个空数组。 就像这样:

{
    "_id" : ObjectId("57c6957fb190ecc02e8b456b"),   
    "categories" : [
        "57c54f0db190ec430d8b4571"
    ],  
    "pcSales" : []
}

saleCategoryId是一个数组字段,其中包含categoriesKey的数组。

请帮忙。

1个回答

11
由于您的localField是一个数组,您需要在查询之前添加一个$unwind阶段到您的流水线中,或者在$project流水线步骤中使用$arrayElemAt来获取数组中实际的元素。
以下是两个示例,其中一个使用了$arrayElemAt操作符:
db.products.aggregate([ 
    { "$match" : { "_id": ObjectId("57c6957fb190ecc02e8b456b") } },
    {
        "$project": {
            "category": { "$arrayElemAt": [ "$categories", 0 ] }            
        }
    },
    {
        "$lookup": {
            from : 'sale',
            localField: 'category', 
            foreignField: 'saleCategoryId', 
            as : 'pcSales'  
        }
    }
]);

并且这个例子使用 $unwind 操作符在应用$lookup管道之前先展开 categories 数组:

db.products.aggregate([ 
    { "$match" : { "_id": ObjectId("57c6957fb190ecc02e8b456b") } },
    { "$unwind": "$categories" },
    {
        "$lookup": {
            from : 'sale',
            localField: 'categories', 
            foreignField: 'saleCategoryId', 
            as : 'pcSales'  
        }
    }
]);

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