如何解决如何将SQLite查询转换为MongoDB查询
如何使用聚合框架将此SQLite查询转换为MongoDB查询
SQLite查询:
"
FROM car
WHERE (@make is NULL OR @make = make)
AND (@model is NULL OR @model = model)
AND (@minPrice is NULL OR @minPrice <= price)
AND (@maxPrice is NULL OR @maxPrice >= price)
"
我试图转换成mongodb聚合框架 每件事都按预期运行
[
{
$match: {
$and: [
{ $or: [{ make: null },{ make: "BMW" }] },{ $or: [{ model: null },{ model: "320" }] },{ $or: [{ price: null },{ price: { $gte: 1000 } }] },{ price: { $lte: 80000 } }] },],},{ $project: { _id: 0,make: 1,model: 1,price: 1 } },];
但是当不匹配“ make”时,它什么也不会返回
[
{
$match: {
$and: [
{ $or: [{ make: null },{ make: "asds" }] },];
解决方法
我通过将{field: null}
替换为{field: {$exists: <false> || <true> } }
详细显示mongodb $exists operator
所以我有这个“汽车”收藏
[
{make: 'Audi',model: 'A2',price: 13999},{make: 'BMW',model: '116',price: 12999},model: 'X1',price: 18999},model: '320',price: 24000},price: 50999},{make: 'Ford',model: 'Fiesta',price: 14999},{make: 'Mazda',model: '6',{make: 'Merces-Benz',model: '200',price: 38999},price: 16999},model: 'e250',price: 11999},]
,如果我搜索有关
- make ='BMW'
- model ='asd'(我们的数据库集合中未提供值)
- minPrice = 1000
- maxPrice = 40000
将返回此结果
{make: 'BMW',
此文档中没有“价格= 50999”
{make: 'BMW',price: 50999}
这意味着“价格”条件也正常工作
让我们对此汇总进行编码
我有一个具有两个阶段的管道'$ match'和'$ project'
const pipeline = [
{
$match: {
$and: [
{ $or: [{ make: { $exists: false } },{ make: "BMW" }] },{ $or: [{ model: { $exists: true } },{ model: "asd" }] },{ $or: [{ price: { $exists: false } },{ price: { $gte: 1000 } }] },{ price: { $lte: 50000 } }] },],},{ $project: { _id: 0,make: 1,model: 1,price: 1 } },];
处于这种“或”状态
{ $or: [{ make: { $exists: false } },{ make: "BMW" }] }
将检查“ make”字段是否存在。
如果不存在($ exists:false)将继续执行“ $ or”运算符中的下一个条件,如果为true,则将继续执行'$ and中的下一个“ $ or”条件'运算符
如果存在($ exists:true)将仅继续到'$ and'运算符中的下一个“ $ or”条件,依此类推。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。