MongoDB中有计算字段吗?
在SQL中,我可以执行以下操作:
SELECT A+B AS C FROM MYTABLE WHERE C>10
Run Code Online (Sandbox Code Playgroud)
我可以在MongoDB中做类似的事情吗?
更新
我做了投影:
db.segments.aggregate(
[
{
$project: {
"_id": 1,
numberOfRestrictions: { $size: "$Speed Restrictions" }
}
}
]
)
Run Code Online (Sandbox Code Playgroud)
而且有效。
不幸的是,进一步的流水线操作不会:
db.segments.aggregate(
[
{
$project: {
"_id": 1,
numberOfRestrictions: { $size: "$Speed Restrictions" }
}
},
{
$match: {
"numberOfRestrictions": {
"$gt": 1
}
}
}
]
)
Run Code Online (Sandbox Code Playgroud)
后导致错误
The argument to $size must be an Array, but was of type: EOO
Run Code Online (Sandbox Code Playgroud)
有一个名为 的运算符$expr
,使您能够在查询中使用聚合框架运算符find()
。
例如,SQL 查询
SELECT A+B AS C FROM MYTABLE WHERE C>10
Run Code Online (Sandbox Code Playgroud)
可以转换为 mongo 查询为
db.segments.find({
"$expr": {
"$gt": [
{ "$add": [ "$A", "$B" ] },
10
]
}
})
Run Code Online (Sandbox Code Playgroud)
对于检查数组长度它是类似的
db.segments.find({
"$expr": {
"$gt": [
{ "$size": "$SpeedRestrictions" },
10
]
}
})
Run Code Online (Sandbox Code Playgroud)
通过聚合框架,还可以$expr
在$match
管道步骤中使用:
db.segments.aggregate([
{ "$match": {
"$expr": {
{ "$gt": [
{ "$size": "$SpeedRestrictions" },
10
] }
}
} }
])
Run Code Online (Sandbox Code Playgroud)
如果该$expr
运算符不可用,为了向后兼容,可以使用$redact
as
db.segments.aggregate([
{ "$redact": {
"$cond": [
{ "$gt": [
{ "$size": "$SpeedRestrictions" },
10
] },
"$$KEEP",
"$$PRUNE"
]
} }
])
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用$addFields
管道运算符创建计算字段,并$match
使用运算符基于该计算字段过滤文档:
db.collection.aggregate([
{ "$addFields": { "C": { "$add": [ "$A", "$B" ] } } },
{ "$match": { "C": { "$gt": 10 } } }
])
Run Code Online (Sandbox Code Playgroud)
是。这称为聚合管道。具体来说,您需要使用一个$project
阶段来创建C
字段,然后使用一个$match
阶段来查找所有符合条件的文档。
首先创建一些文档:
for( var i = 1; i <=10; i++){
db.agg.insert({a:i,b:i})
}
Run Code Online (Sandbox Code Playgroud)
结果是如下所示的集合:
> db.agg.find()
{ "_id" : ObjectId("56c1b5561a3b578f37a99d4d"), "a" : 1, "b" : 1 }
{ "_id" : ObjectId("56c1b5561a3b578f37a99d4e"), "a" : 2, "b" : 2 }
{ "_id" : ObjectId("56c1b5561a3b578f37a99d4f"), "a" : 3, "b" : 3 }
{ "_id" : ObjectId("56c1b5561a3b578f37a99d50"), "a" : 4, "b" : 4 }
{ "_id" : ObjectId("56c1b5561a3b578f37a99d51"), "a" : 5, "b" : 5 }
{ "_id" : ObjectId("56c1b5561a3b578f37a99d52"), "a" : 6, "b" : 6 }
{ "_id" : ObjectId("56c1b5561a3b578f37a99d53"), "a" : 7, "b" : 7 }
{ "_id" : ObjectId("56c1b5561a3b578f37a99d54"), "a" : 8, "b" : 8 }
{ "_id" : ObjectId("56c1b5561a3b578f37a99d55"), "a" : 9, "b" : 9 }
{ "_id" : ObjectId("56c1b5561a3b578f37a99d56"), "a" : 10, "b" : 10 }
Run Code Online (Sandbox Code Playgroud)
db.agg.aggregate([
// You need to include all fields you want to have
// in the resulting document within the $project stage
{ "$project":{ a:1, b:1, c:{ "$add": ["$a","$b"] }}},
{ "$match":{ c:{ "$gt":10 }}}
])
Run Code Online (Sandbox Code Playgroud)
返回以下结果:
{ "_id" : ObjectId("56c1b5561a3b578f37a99d52"), "a" : 6, "b" : 6, "c" : 12 }
{ "_id" : ObjectId("56c1b5561a3b578f37a99d53"), "a" : 7, "b" : 7, "c" : 14 }
{ "_id" : ObjectId("56c1b5561a3b578f37a99d54"), "a" : 8, "b" : 8, "c" : 16 }
{ "_id" : ObjectId("56c1b5561a3b578f37a99d55"), "a" : 9, "b" : 9, "c" : 18 }
{ "_id" : ObjectId("56c1b5561a3b578f37a99d56"), "a" : 10, "b" : 10, "c" : 20 }
Run Code Online (Sandbox Code Playgroud)