web-dev-qa-db-ja.com

$ lookupを使用したMongoDB集計は、クエリから返されるフィールドを制限します

Mongoでは、$lookupaggregationを実行した後、ドキュメント全体ではなく、一部のフィールドのみを返すように要求したいと思います。

私は次のクエリを持っています:

db.somecollection.aggregate([{
    $lookup: {
        from: "campaigns",
        localField: "campId",
        foreignField: "_id",
        as: "campaign"
    }
}, {
    $unwind: "$campaign"
}, {
    $lookup: {
        from: "entities",
        localField: "campaign.clientid",
        foreignField: "_id",
        as: "campaign.client"
    }
}]);

このリクエストは私にこれを返します:

{
"_id" : ObjectId("56cc7cd1cc2cf62803ebfdc7"),
"campId" : ObjectId("56c740e4479f46e402efda84"),
"articleId" : ObjectId("56c742c06094640103ba3843"),
"campaign" : {
    "_id" : ObjectId("56c740e4479f46e402efda84"),
    "clientid" : ObjectId("56c740b8479f46e402efda83"),
    "client" : [
        {
            "_id" : ObjectId("56c740b8479f46e402efda83"),
            "username" : "someusername",
            "shhh" : "somehashedpassword",
            "email" : "[email protected]",
        }
    ]
}

リクエストはうまく機能しますが、campaign.clientのフィールドをフィルタリングして、たとえば_idusernameのみを取得したいと思います。 MongoDB aggregateリクエストでこれを行う方法はありますか?

これで他の人を助けるために、@ SiddhartAjmeraには正しい答えがあります。「campaign.clientid」のようなネストされた値に二重引用符を追加するだけでした。

最終的なコードは次のとおりです。

db.somecollection.aggregate([
      {
        "$lookup": {
          "from": "campaigns",
          "localField": "campId",
          "foreignField": "_id",
          "as": "campaign"
        }
      },
      {
        "$unwind": "$campaign"
      },
      {
        "$lookup": {
          "from": "entities",
          "localField": "campaign.clientid",
          "foreignField": "_id",
          "as": "campaign.client"
        }
      },
      {
        "$project": {
          "_id": 1,
          "campId": 1,
          "articleId": 1,
          "campaign._id": 1,
          "campaign.clientid": 1,
          "campaign.client._id": 1,
          "campaign.client.username": 1
        }
      }
]);
41