MongoDB $ifNull场景下,如何在Java中创建含DBObject与列表的混合列表?
把MongoDB的$ifNull表达式转成Java实现,顺便搞定混合列表创建
嘿,我来帮你一步步解决这两个问题!
先搞定$ifNull的Java实现
MongoDB的{ "$ifNull": [ {some DBObject}, [] ] }这个表达式,在Java里根据你用的MongoDB驱动版本,有两种写法:
旧版驱动(用DBObject)
如果你的项目还在用2.x版本的驱动,用BasicDBObject和BasicDBList就能轻松构建:
// 先定义你要用到的那个DBObject DBObject someDbObject = new BasicDBObject("targetField", "yourValue"); // 构建$ifNull表达式,第二个参数用BasicDBList表示空数组 DBObject ifNullExpr = new BasicDBObject("$ifNull", Arrays.asList(someDbObject, new BasicDBList()));
新版驱动(用Document)
要是用的是3.x及以上的新版驱动,推荐用Document和普通List,更简洁:
// 定义目标Document(对应原表达式里的some DBObject) Document someDoc = new Document("targetField", "yourValue"); // 准备$ifNull的参数列表,空数组直接用Collections.emptyList() List<Object> ifNullParams = Arrays.asList(someDoc, Collections.emptyList()); Document ifNullExpr = new Document("$ifNull", ifNullParams);
再创建包含不同元素的混合列表
你说有一个包含DBObject的列表,还有另一个列表,要把这两个(或者它们的元素)放进同一个列表里?分两种情况:
把两个列表作为元素放进新列表
如果是想让新列表里直接包含这两个列表本身,那只要把新列表的泛型设为Object就行:
// 假设你已经有这两个列表了 List<DBObject> dbObjList = new ArrayList<>(); List<String> otherList = new ArrayList<>(); // 创建混合列表,把两个列表作为元素加进去 List<Object> mixedList = new ArrayList<>(); mixedList.add(dbObjList); mixedList.add(otherList);
把两个列表的所有元素合并成一个新列表
要是想把两个列表里的元素全部合并到一个列表里,那就用addAll方法:
List<Object> mergedList = new ArrayList<>(); // 先加DBObject列表的所有元素 mergedList.addAll(dbObjList); // 再加另一个列表的所有元素 mergedList.addAll(otherList);
这里要注意,因为合并后的列表元素类型不同,所以泛型用Object才能兼容。后续操作元素的时候,记得用instanceof做类型检查,避免类型转换出错哦~
内容的提问来源于stack exchange,提问作者Ohad
相关产品推荐
相关产品推荐

