実行したいMongoDBリクエストで問題が発生しました。私が使用していますMongoDBを3.2とNode.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', ...]
アプリケーションのfind
ordistinct
メソッドを処理するためのマングーススキーマがあります。$
ポジショニング演算子を使っていろいろな操作をしてみました。これが私の試みですが、すべてのコンポーネントからすべてのパラメータを返します。
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コマンドラインの場合は非常に優れています:))
目的の結果を得るには、$arrayElemAt
and$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]
コメントを追加