【问题标题】:Use array first field in mongo aggregate $lookup query to match a document在 mongo 聚合 $lookup 查询中使用数组第一个字段来匹配文档
【发布时间】:2016-09-01 09:44:24
【问题描述】:

我想使用我的数组字段第 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 数组的数组字段。

请帮忙。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework mongodb-aggregation


    【解决方案1】:

    因为您的 localField 是一个数组,所以您需要在查找之前将 $unwind 阶段添加到您的管道或使用 $arrayElemAt$project 管道步骤以获取数组中的实际元素。

    这里有两个例子,一个使用 $arrayElemAt 运算符:

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

    在应用 $lookup 管道之前,它首先使用 $unwind 来展平类别数组:

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

    【讨论】:

      猜你喜欢
      • 2022-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 2023-03-05
      • 1970-01-01
      • 2017-03-29
      • 2018-02-24
      相关资源
      最近更新 更多