ここで基本的な場合は、単純に各インデックスで調べるために$redact
と$arrayElemAt
で条件を適用することです:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$arrayElemAt": ["$arr.int", 0] },
{ "$arrayElemAt": ["$arr.int", 1] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
これは"if"
条件がある方法で$cond
を採用し、特殊なパイプラインステージであります"then"
を受け取りました"$$KEEP"
結果の文書、そうでなければ"else"
私達は"$$PRUNE"
それから結果。
これはネイティブ演算子を使用しており、計算に依存するこのようなクエリが得られるようになると「パフォーマンス」として機能します。でも、実際に.find()
で使用することができ
db.collection.aggregate([
{ "$match": {
"$expr": {
"$gt": [
{ "$arrayElemAt": ["$arr.int", 0] },
{ "$arrayElemAt": ["$arr.int", 1] }
]
}
}}
])
:
db.collection.find({
"$expr": {
"$gt": [
{ "$arrayElemAt": ["$arr.int", 0] },
{ "$arrayElemAt": ["$arr.int", 1] }
]
}
})
を介して、JavaScriptの評価を支えてきたのリリース以降のすべてのバージョン
のMongoDB 3.6
は少し短い
$expr
を使用して、この上の構文を使用できます
$where
:
db.collection.find({
"$where": "return this.arr[0].int > this.arr[1].int"
})
しかし、これは各文書のJavaScript式の評価を必要とするため、ネイティブ演算子を使用する場合ほどの効果がありません。
また、あなたがあなたの「比」応答を得る唯一の方法は、実際に.find()
クエリが行うことができない、結果が返され、「変更する」ことができます集約パイプラインを使用することです:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$arrayElemAt": ["$arr.int", 0] },
{ "$arrayElemAt": ["$arr.int", 1] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}},
{ "$addFields": {
"ratio": {
"$divide": [
{ "$arrayElemAt": ["$arr.int", 1] },
{ "$arrayElemAt": ["$arr.int", 0] }
]
}
}}
])
についての素晴らしいものは「ありませんコレクション内のすべてのドキュメントを実行し、条件に一致するかどうかを確認する以外の選択肢がないため、「条件としての計算」を行うことはできません。
これが「共通ロジック」の場合は、代わりにドキュメントに保存する方がよいでしょう。私。E:
{ "arr": [{ "int": 100 },{ "int": 10 }], "firstIsGreater": true }
次に、あなたが実際にはは、効率的な方法で選択のためのインデックスを使用「することができます」。したがって、ドキュメント内のコンテンツを変更したときにこの条件を記述することは、アプリケーションロジックによって異なります。したがって、このような計算は必要ありません。
このようにモデル化して保存することができない場合は、どちらの形式でも計算が完了します。したがって、最初に計算された条件が必要と思われる理由を考えてみるのが一般的には良いです。
計算は「常に」高価です。あなたは "本当に"何をしようとしていますか?簡単なケースに答えることは本当に多くの答えではありません –
ちょっと男 - それは本当に簡単なケースb/cに質問が本当にmongoの構文について、そしてこれがmongoで可能かどうかを考えます。 –