Mongodb 使用mongo aggregate$lookup查询中的数组第一个字段匹配文档

Mongodb 使用mongo aggregate$lookup查询中的数组第一个字段匹配文档,mongodb,mongodb-query,aggregation-framework,mongodb-aggregation,Mongodb,Mongodb Query,Aggregation Framework,Mongodb Aggregation,我想使用我的数组字段第0个值,使用Mongo aggregate$lookup查询在销售文档中查找匹配项。我的问题是: db.products.aggregate([ { $match : { _id:ObjectId("57c6957fb190ecc02e8b456b") } }, { $lookup : { from : 'sale', localField: 'categories.0', foreignField

我想使用我的数组字段第0个值,使用Mongo aggregate$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数组


请提供帮助。

因为您的
localField
是一个数组,您需要在查找之前向管道中添加一个阶段,或者在管道步骤中使用来获取数组中的实际元素

以下是两个示例,其中一个使用运算符:

db.products.aggregate([ 
    { "$match" : { "_id": ObjectId("57c6957fb190ecc02e8b456b") } },
    {
        "$project": {
            "category": { "$arrayElemAt": [ "$categories", 0 ] }            
        }
    },
    {
        "$lookup": {
            from : 'sale',
            localField: 'category', 
            foreignField: 'saleCategoryId', 
            as : 'pcSales'  
        }
    }
]);
这将使用首先展平类别数组,然后再应用管道:

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