5

配列フィールドの 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 も、categorysKey の配列を含む配列フィールドです。

助けてください。

4

1 に答える 1

10

は配列であるため、ルックアップの前にパイプラインにステージをlocalField追加するか、パイプライン ステップで を使用して配列内の実際の要素を取得する必要があります。$unwind$arrayElemAt$project

$arrayElemAt演算子を使用する 2 つの例を次に示します。

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

これは、パイプライン$unwindを適用する前に、最初にカテゴリ配列をフラット化するために使用します。$lookup

db.products.aggregate([ 
    { "$match" : { "_id": ObjectId("57c6957fb190ecc02e8b456b") } },
    { "$unwind": "$categories" },
    {
        "$lookup": {
            from : 'sale',
            localField: 'categories', 
            foreignField: 'saleCategoryId', 
            as : 'pcSales'  
        }
    }
]);
于 2016-09-01T10:11:04.240 に答える