2017-11-15 11 views
0

私のmongodbクエリでは、$ addFieldsを使って他の3つのフィールドを連結したIDフィールドを追加します。私の問題は、私が照会する価値のある新しい追加フィールドと一致すれば結果が得られないということです。他のフィールドでは、うまく動作します。

order of aggregation

what is in aggregation

data = await model.aggregate([ 
      { 
       $project: { 
        projectName: 1, 
        price: 1, 
        'document': '$$ROOT' 
       } 
      }, 
      { 
       $addFields:{ 
        'document.id': {$concat: ['$document.propertyId.prefix','$document.propertyId.number']} 
       } 
      }, 
      { 
       $match: { 
        $and: [ 
         { 
          $or: [ 
           {id: {$regex: '.*' + req.query.search + '.*', $options: "i"}}, 
           {projectName: {$regex: '.*' + req.query.search + '.*', $options: "i"}}, 

           /*This also doesnt work*/ 
           // {'document.id': {$regex: '.*' + req.query.search + '.*', $options: "i"}}, 
           // {'document.projectName': {$regex: '.*' + req.query.search + '.*', $options: "i"}}, 
          ] 
         } 
        ] 
       } 
      }, 
      { 
       $replaceRoot: {newRoot: "$document"} 
      }, 
      { 
       $sort: { 
        [sortBy]: sortType 
       } 
      }, 
     ]); 
+0

あなたのデータとクエリの外観は? – Astro

+0

@Astro、私はそれらのパラメータを入れます。あなたは添付の写真でそれらを見ることができます – sophanith

+0

@Astro、$ projectのために$$ ROOTを使ってすべてのフィールドを取得し、次に3つのフィールドを連結してidフィールドを追加しました。その後、私はその新しい追加フィールドの値を照会したい。 – sophanith

答えて

0

人々があなたの問題を再現することができますので、次回はあなたの文書のサンプルを追加してください。あなたの問題がどこにあるのかわからないと言いました。あなたのユースケースを再現するためにいくつかのデータを作成しました。だから私は、次のドキュメントを追加しました:

{ 
    "_id" : ObjectId("5a0d5d376c9b762a7c035ec4"), 
    "projectName" : "some stack test", 
    "price" : NumberInt(45), 
    "propertyId" : { 
     "prefix" : "a", 
     "number" : "7" 
    } 
} 

その後、私は(ソートなし)スクリプトを実行し、それが正常に動作します:

db.yourCollectionName.aggregate([ 
    { 
     $project: { 
      "projectName": 1, 
      "price": 1, 
      "document": '$$ROOT' 
     } 
    }, 
    { 
     $addFields: { 
      "document.id": { 
       $concat: ['$document.propertyId.prefix', '$document.propertyId.number'] 
      } 
     } 
    }, 
    { 
     $match: { 
      $and: [{ 
       $or: [{ 
         "projectName": { 
          $regex: '.*' + "some stack test" 
         } 
        }, 

        { 
         "document.id": { 
          $regex: '.*' + "a" + '.*', 
          $options: "7" 
         } 
        } 
       ] 
      }] 

     } 
    }, 
    { 
     $replaceRoot: { 
      newRoot: "$document" 
     } 
    } 
]) 

あなたは何の結果を得るていないという事実は、おそらくあなたのリクエストパラメータによるものです。他にも"projectName"の検索パラメータは、"document.id"と同じですか? 一致するパイプラインをもう一度チェックしてください:

{"projectName": {$regex: '.*' + req.query.search + '.*', $options: "i"}},  
{'document.id': {$regex: '.*' + req.query.search + '.*', $options: "i"}} 
+0

はい、あなたは正しいです。どういうわけか私のパラメータには見えないスペースがありますが、私はそのように渡しませんでした。 特定のテキストがいずれかのフィールドに存在するかどうかを検索したいので、同じ検索パラメータがあります。 ありがとう – sophanith

関連する問題