如何在管道聚合中比较文档中的两个字段 (mongoDB)
how to compare two fields in a document in pipeline aggregation (mongoDB)
我有如下文件:
{
"user_id": NumberLong(1),
"updated_at": ISODate("2016-11-17T09:35:56.200Z"),
"created_at": ISODate("2016-11-17T09:35:07.981Z"),
"banners": {
"normal_x970h90": "/images/banners/4/582d79cb3aef567d64621be9/photo-1440700265116-fe3f91810d72.jpg",
"normal_x468h60": "/images/banners/4/582d79cb3aef567d64621be9/photo-1433354359170-23a4ae7338c6.jpg",
"normal_x120h600": "/images/banners/4/582d79cb3aef567d64621be9/photo-1452570053594-1b985d6ea890.jpg"
},
"name": "jghjghjghj",
"budget": "2000",
"plan": null,
"daily_budget": "232323",
"daily_budget_auto": "",
"href": "qls2.ir",
"targets": {
"cats": [
"fun",
"news"
],
"region": "inIran",
"iran_states": null,
"os": "all",
"gold_network": true,
"dont_show_between_1_n_8": true
},
"payment": {
"bank": "mellat",
"tax": "add"
},
"click_cost": "102000",
"status": null
}
我想在检查查询中的其他一些参数时检查 budget
是否低于 click_cost
:
db.bcamp.aggregate(
[
{
$match:{
$and: [
{"targets.cats":{
"$in" : ["all"]
}
},
{"banners.normal_x970h90":{
"$exists":true
}
},
{"href": {
$nin: ["qls.ir"]
}
}
]
}
}
]).pretty();
我尝试过比较方法,例如:
db.bcamp.aggregate(
[
{$project: {ab: {$cmp: ['$budget','$clickcost']}}},
{$match: {ab:{$gt:1}}}
]).pretty();
但我得到了错误的结果,它 returns 总是 4 个文档,其预算可能大于也可能不大于 click_cost,这意味着它获取了错误的数据。
如何将该比较添加到我的 mongoDB 管道中?
问题不在于比较运算符,而是您正在比较的值的类型。您应该将变量类型更改为数字。根据您的比较,将您的匹配项更改为 1、-1 或 0。
db.bcamp.aggregate(
[
{$project: {ab: {$cmp: ['$budget','$clickcost']}}},
{$match: {ab:{$eq:1}}}
]).pretty();
您可以在 3.6 版本中使用 $expr
。
db.bcamp.aggregate(
[
{$match: {$expr: {$eq: ["$budget", "$clickcost"]}}}
]).pretty();
或者
db.bcamp.find(
{$expr: {$eq: ["$budget", "$clickcost"]}}
).pretty();
我有如下文件:
{
"user_id": NumberLong(1),
"updated_at": ISODate("2016-11-17T09:35:56.200Z"),
"created_at": ISODate("2016-11-17T09:35:07.981Z"),
"banners": {
"normal_x970h90": "/images/banners/4/582d79cb3aef567d64621be9/photo-1440700265116-fe3f91810d72.jpg",
"normal_x468h60": "/images/banners/4/582d79cb3aef567d64621be9/photo-1433354359170-23a4ae7338c6.jpg",
"normal_x120h600": "/images/banners/4/582d79cb3aef567d64621be9/photo-1452570053594-1b985d6ea890.jpg"
},
"name": "jghjghjghj",
"budget": "2000",
"plan": null,
"daily_budget": "232323",
"daily_budget_auto": "",
"href": "qls2.ir",
"targets": {
"cats": [
"fun",
"news"
],
"region": "inIran",
"iran_states": null,
"os": "all",
"gold_network": true,
"dont_show_between_1_n_8": true
},
"payment": {
"bank": "mellat",
"tax": "add"
},
"click_cost": "102000",
"status": null
}
我想在检查查询中的其他一些参数时检查 budget
是否低于 click_cost
:
db.bcamp.aggregate(
[
{
$match:{
$and: [
{"targets.cats":{
"$in" : ["all"]
}
},
{"banners.normal_x970h90":{
"$exists":true
}
},
{"href": {
$nin: ["qls.ir"]
}
}
]
}
}
]).pretty();
我尝试过比较方法,例如:
db.bcamp.aggregate(
[
{$project: {ab: {$cmp: ['$budget','$clickcost']}}},
{$match: {ab:{$gt:1}}}
]).pretty();
但我得到了错误的结果,它 returns 总是 4 个文档,其预算可能大于也可能不大于 click_cost,这意味着它获取了错误的数据。
如何将该比较添加到我的 mongoDB 管道中?
问题不在于比较运算符,而是您正在比较的值的类型。您应该将变量类型更改为数字。根据您的比较,将您的匹配项更改为 1、-1 或 0。
db.bcamp.aggregate(
[
{$project: {ab: {$cmp: ['$budget','$clickcost']}}},
{$match: {ab:{$eq:1}}}
]).pretty();
您可以在 3.6 版本中使用 $expr
。
db.bcamp.aggregate(
[
{$match: {$expr: {$eq: ["$budget", "$clickcost"]}}}
]).pretty();
或者
db.bcamp.find(
{$expr: {$eq: ["$budget", "$clickcost"]}}
).pretty();