在MongoDB中搜索文档时如何使用两个字段的总和?
How to use the sum of two fields when searching for a document in MongoDB?
我有一个帐户集合,我正试图找到一个帐户,其中 targetAmount >= totalAmount + N
{
"_id": {
"$oid": "60d097b761484f6ad65b5305"
},
"targetAmount": 100,
"totalAmount": 0,
"highPriority": false,
"lastTimeUsed": 1624283088
}
现在我只是 select 所有帐户,遍历它们并检查是否满足条件。但我正试图在一个查询中完成这一切:
amount = 10
tasks = ProviderAccountTaskModel.objects(
__raw__={
'targetAmount': {
'$gte': {'$add': ['totalAmount', amount]}
}
}
).order_by('-highPriority', 'lastTimeUsed')
我也尝试过使用 $sum
,但是这两个选项都不起作用。
搜索的时候不能用,还是我走错路了?
您必须使用聚合而不是 find 命令,因为除了算术运算之外文档的自引用将不起作用。
以下是您要查找的聚合命令。将其转换为 motoengine 等效命令。
db.collection.aggregate([
{
"$match": {
"$expr": {
"$gte": [
"$targetAmount",
{
"$sum": [
"$totalAmount",
10
]
},
],
},
},
},
{
"$sort": {
"highPriority": -1,
"lastTimeUsed": 1,
},
},
])
您可以使用 $where
。请注意,它会相当慢(必须在每条记录上执行 Javascript 代码),因此如果可以,请结合索引查询。
db.getCollection('YourCollectionName').find( { $where: function() { return this.targetAmount > (this.totalAmount + 10) } })
或更紧凑的方式是
db.getCollection('YourCollectionName').find( { $where: "this.targetAmount > this.totalAmount + 10" })
我有一个帐户集合,我正试图找到一个帐户,其中 targetAmount >= totalAmount + N
{
"_id": {
"$oid": "60d097b761484f6ad65b5305"
},
"targetAmount": 100,
"totalAmount": 0,
"highPriority": false,
"lastTimeUsed": 1624283088
}
现在我只是 select 所有帐户,遍历它们并检查是否满足条件。但我正试图在一个查询中完成这一切:
amount = 10
tasks = ProviderAccountTaskModel.objects(
__raw__={
'targetAmount': {
'$gte': {'$add': ['totalAmount', amount]}
}
}
).order_by('-highPriority', 'lastTimeUsed')
我也尝试过使用 $sum
,但是这两个选项都不起作用。
搜索的时候不能用,还是我走错路了?
您必须使用聚合而不是 find 命令,因为除了算术运算之外文档的自引用将不起作用。
以下是您要查找的聚合命令。将其转换为 motoengine 等效命令。
db.collection.aggregate([
{
"$match": {
"$expr": {
"$gte": [
"$targetAmount",
{
"$sum": [
"$totalAmount",
10
]
},
],
},
},
},
{
"$sort": {
"highPriority": -1,
"lastTimeUsed": 1,
},
},
])
您可以使用 $where
。请注意,它会相当慢(必须在每条记录上执行 Javascript 代码),因此如果可以,请结合索引查询。
db.getCollection('YourCollectionName').find( { $where: function() { return this.targetAmount > (this.totalAmount + 10) } })
或更紧凑的方式是
db.getCollection('YourCollectionName').find( { $where: "this.targetAmount > this.totalAmount + 10" })