【发布时间】:2020-05-19 14:44:47
【问题描述】:
在下面的集合中,“数量”列包含整数值,但数据类型是字符串。
我想将“数量”字段与聚合中的整数进行比较,将“仓库”字段与字符串“A”进行比较。 ("数量" > 2 和 "仓库" = "A")
[无法将集合中的数据类型更改为整数,因为存在巨大的依赖关系]
编辑:需要检索所有列和所有符合条件的文档。
查询:得到不正确的结果
db.runCommand(
{
aggregate: "products", pipeline: [
{
$match: {
instock: {
$elemMatch: {
warehouse: "A",
qty: { $gt: "2" }
}
}
}
},
{ $project: { _id: 0 } }],
cursor: { batchSize: 200 }
});
结果:虽然满足条件,但没有得到 item = journal 的文档
/* 1 */
{
"item" : "paper",
"instock" : [
{
"warehouse" : "A",
"qty" : "60"
},
{
"warehouse" : "B",
"qty" : "15"
}
]
},
/* 2 */
{
"item" : "planner",
"instock" : [
{
"warehouse" : "A",
"qty" : "22"
},
{
"warehouse" : "B",
"qty" : "5"
}
]
}
产品集合
[
{
"item": "journal",
"instock": [
{
"warehouse": "A",
"qty": "11"
},
{
"warehouse": "C",
"qty": "15"
}
]
},
{
"item": "paper",
"instock": [
{
"warehouse": "A",
"qty": "60"
},
{
"warehouse": "B",
"qty": "15"
}
]
},
{
"item": "planner",
"instock": [
{
"warehouse": "A",
"qty": "22"
},
{
"warehouse": "B",
"qty": "5"
}
]
}
]
在这种情况下,将不正确的结果作为大于运算符按字典顺序工作,但它应该像整数一样工作。虽然我尝试将其转换为双倍,但我没有得到任何结果。
使用 $convert to double 进行查询:没有结果
db.runCommand(
{
aggregate: "products", pipeline: [
//{ $match: { "item": { $in: ["planner", "paper","journal"] } } },
{
$match: {
instock: {
$elemMatch: {
warehouse: "A",
qty: {
$gt: [
{$convert:{ input: "$qty", to: "double" }}, 5]
}
}
}
}
},
{ $project: { _id: 0 } }],
cursor: { batchSize: 200 }
});
【问题讨论】:
-
你为什么要像这样运行查询 ::
db.runCommand在管理员上,你可以只在数据库集合上运行查询而不是你在做什么,因为通常我们不这样做,在这种情况下你也不需要做任何转换,而且不需要为这个简单的任务使用聚合框架,只需使用.find():-) -
用户在 UI 上以图形方式创建查询,他选择字段并对其应用运算符和过滤器..
-
对集合执行查询与传递 runCommands 有什么关系?
-
这些与数据结构屏幕有关。集合名称和列是动态的。因此,我们正在使用所有复杂的业务规则创建自定义查询,并在 db.runCommand 的帮助下在 Mongodb 中执行该查询。请建议是否有更好的方法。
-
您在哪里通过代码或外壳执行查询?
标签: mongodb mongoose mongodb-query type-conversion aggregation-framework