残念ながらあなたの現在のバージョンでは、case文/式を模倣するネイティブMongoDB演算子を持つperform-antソリューションは考えられません。
しかし、MongoDBのサーバー3.4とマングース> = 4.7.3のために、あなたは特に新しい$addFields
ステージと、このようなクエリの$switch
オペレータを集約フレームワークを使用することができます解決策があります。
$addFields
ステージは、明示的に入力文書内のすべての既存のフィールドを指定し、文書に新しいフィールドを追加し$project
段階に相当します。あなたのケースでは、それはあなたの$match
クエリで使用されている新しいフィールドフィールドを作成する必要があります。
$switch
演算子は、一連のケース式を評価します。真と評価される式が見つかると、 $switch
が実行され、制御フローからブレークします。
移入テストコレクション:
year = 2016;
db.test.aggregate([
{
"$addFields": {
"incomesForMonth": {
"$switch": {
"branches": [
{
"case": "$isMonthly", /* same as "case": { "$eq": [ "$isMonthly", true ] }, */
"then": { "$eq": [ "$dateFrom.year", year ] }
},
{
"case": { "$eq": [ "$isMonthly", false ] },
"then": {
"$and": [
{ "$lte": [ "$dateFrom.year", year ] },
{ "$gte": [ "$dateTo.year", year ] }
]
}
}
]
}
}
}
},
{ "$match": { "incomesForMonth": true } }
])
サンプル出力
db.test.insert([
{
name: "foo",
amount: 4,
amountAfterTax: 3.2,
dateFrom: {
month: 11,
year: 2016
},
dateTo: {
month: 2,
year: 2017
},
isMonthly: true,
userId: ObjectId("5864b49ab5a589b63ee298e8")
},
{
name: "test",
amount: 547.74,
amountAfterTax: 507.15,
dateFrom: {
month: 4,
year: 2016
},
dateTo: {
month: 4,
year: 2017
},
isMonthly: true,
userId: ObjectId("5864b49ab5a589b63ee298e8")
},
{
name: "bar",
amount: 56,
amountAfterTax: 47.54,
dateFrom: {
month: 5,
year: 2016
},
dateTo: {
month: 7,
year: 2016
},
isMonthly: false,
userId: ObjectId("5864b49ab5a589b63ee298e8")
}
])
実行集計クエリ
のは、モンゴシェルの例でこれを証明してみましょう
/* 1 */
{
"_id" : ObjectId("586ea7bafedfbcfd0ed15f9a"),
"name" : "foo",
"amount" : 4.0,
"amountAfterTax" : 3.2,
"dateFrom" : {
"month" : 11.0,
"year" : 2016.0
},
"dateTo" : {
"month" : 2.0,
"year" : 2017.0
},
"isMonthly" : true,
"userId" : ObjectId("5864b49ab5a589b63ee298e8"),
"incomesForMonth" : true
}
/* 2 */
{
"_id" : ObjectId("586ea7bafedfbcfd0ed15f9b"),
"name" : "test",
"amount" : 547.74,
"amountAfterTax" : 507.15,
"dateFrom" : {
"month" : 4.0,
"year" : 2016.0
},
"dateTo" : {
"month" : 4.0,
"year" : 2017.0
},
"isMonthly" : true,
"userId" : ObjectId("5864b49ab5a589b63ee298e8"),
"incomesForMonth" : true
}
/* 3 */
{
"_id" : ObjectId("586ea7bafedfbcfd0ed15f9c"),
"name" : "bar",
"amount" : 56.0,
"amountAfterTax" : 47.54,
"dateFrom" : {
"month" : 5.0,
"year" : 2016.0
},
"dateTo" : {
"month" : 7.0,
"year" : 2016.0
},
"isMonthly" : false,
"userId" : ObjectId("5864b49ab5a589b63ee298e8"),
"incomesForMonth" : true
}
あなたはMongooseとMongoDB Serverのバージョンを教えてください。あなたのサーバ上のMongoDBのバージョンに依存する解決策を提案したいと思います。 'MongoDB Server 3.4.x:mongoose> = 4.7.3' – chridam
現在、私はmongooseを' 4.3.6'で使用しています。 mlab.comで、私はそれが '3.2.x'で最大だと思います。 –