MongoDBリクエスト:埋め込み配列の埋め込みドキュメントから特定のフィールドのみをフィルタリングします

CloudCompany

実行したいMongoDBリクエストで問題が発生しました。私が使用していますMongoDBを3.2Node.jsのコンテキストでマングースをドキュメントは次のとおりです。

{
  _id: ObjectId('12345'),
  name: "The name",
  components: [
    {
      name: "Component 1",
      description: "The description",
      container: {
        parameters: [
          {
            name: "Parameter 1",
            value: "1"
          },
          // other parameters
        ],
        // other information...
      }
    },
    // other components
  ]
}

そして、特定のドキュメント(_idを使用)の特定のコンポーネント(コンポーネント名を使用)のすべてのパラメーター名を次の出力で一覧表示したいと思います。

['Parameter 1', 'Parameter 2', ...]

アプリケーションのfindordistinctメソッドを処理するためのマングーススキーマがあります。$ポジショニング演算子を使っていろいろな操作をしてみましたこれが私の試みですが、すべてのコンポーネントからすべてのパラメータを返します。

listParameters(req, res) {
  DocumentModel.distinct(
    "components.container.parameters.name", 
    {_id: req.params.modelId, "components.name": req.params.compId},
    (err, doc) => {            
      if (err) {
        return res.status(500).send(err);
      }
      res.status(200).json(doc);
    }
  );
}

ただし、出力はパラメーター名のリストですが、特定のコンポーネントのフィルターは含まれていません。適切なリクエストを見つけるのを手伝ってもらえますか?(可能であればmongoose JSで可能ですが、Mongoコマンドラインの場合は非常に優れています:))

クリダム

目的の結果を得るには、$arrayElemAtand$filter演算子を使用する集計パイプラインを実行する必要があります。

$filterオペレータは、フィルタリングされますcomponentsながら所定の条件を満足する要素返すように配列を$arrayElemAt指定されたインデックス位置に戻るアレイから文書を。そのドキュメントを使用して、ネストされたparameters配列要素を別の配列に投影できます

上記を組み合わせると、理想的には次の集計操作が必要になります。

DocumentModel.aggregate([
    { "$match": { "_id": mongoose.Types.ObjectId(req.params.modelId) } },
    { "$project": {
        "component": {
            "$arrayElemAt": [
                {
                    "$filter": {
                        "input": "$components",
                        "as": "el",
                        "cond": { "$eq": ["$$el.name", req.params.compId] }
                    }
                }, 0
            ]
        }
    } },
    { "$project": {
        "parameters": "$component.container.parameters.name"
    } }
], (err, doc) => {            
  if (err) {
    return res.status(500).send(err);
  }
  const result = doc.length >= 1 ? doc[0].parameters : [];
  res.status(200).json(result);
})

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ