ArangoDB 排除空值排序

在开发过程中,遇到了这样一个场景:collection 中存在某一个字段,这里假设为 age,某些数据的 age 值为 null,进行升序排序时,值为 null 的数据会排在最前面(在许多编程语言和数据库中,null被视为一个特殊的值,它表示缺失或未知的数据。在排序时,null通常被认为是最小的值,因此会被排在前面。)。但实际上我们并不关心值为 null 的数据,理想情况下应该在值为非空的数据排序完以后再将值为 null 的数据加到后面,接下来记录两种实现方法,方便以后开发抄作业。

一. 添加测试数据

创建 sortTest 表,并添加几条测试数据,方便测试

 二. 代码实现

查询条件有两个参数:

        field:用来指定排序的字段

        sort:用来判断升序还是降序

接下来记录实现方法,为图方便简化了相关结构

1. controller

import com.alibaba.fastjson.JSONObject;
import com.example.demo.service.TestService;
import com.example.demo.test.Test2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/test")
@CrossOrigin(value = "*",  maxAge = 3600)
public class TestController {

    @Autowired
    private TestService service;

    @RequestMapping(value = "/sort", method = RequestMethod.GET)
    public List sortList(@RequestBody JSONObject input) {
        String field = input.getString("field");
        String sort = input.getString("sort");
        return service.sortList(field, sort);
    }

}

2. service

import com.example.demo.dao.TestImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TestService {

    @Autowired
    private TestImpl testImpl;

    public List sortList(String field, String sort) {
        return testImpl.sortList1(field, sort);
    }

}

3. respositoryImpl

import com.arangodb.ArangoCursor;
import com.arangodb.springframework.core.ArangoOperations;
import com.arangodb.util.MapBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Repository
public class TestImpl {

    @Autowired
    private ArangoOperations arangoOperations;

    //方法1
    public List sortList1(String field, String sort) {
        StringBuilder query = new StringBuilder("FOR d IN sortTest LET sortValue = d.@field == null ? ");
        if (sort.equalsIgnoreCase("ASC")) {
            query.append("1 : 0");
        } else {
            query.append("0 : 1");
        }
        query.append(" SORT sortValue @sort, d.@field @sort RETURN d");
        ArangoCursor<Map> cursor = arangoOperations.query(query.toString(), new MapBuilder().put("field", field).put("sort", sort).get(), Map.class);
        return cursor.asListRemaining();
    }

    //方法2
    public List sortList2(String field, String sort) {
        String query = "FOR doc IN sortTest\n" +
                "    SORT doc.@field != null DESC, doc.@field @sort\n" +
                "    RETURN doc";
        ArangoCursor<Map> cursor = arangoOperations.query(query, new MapBuilder().put("field", field).put("sort", sort).get(), Map.class);
        return cursor.asListRemaining();
    }

}

三. 结果测试

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值