Mongodb操作内嵌列表
查询
符号:$
描述
占位符$的作用主要是用于返回数组中第一个匹配的数组元素值,重点是第一个在更新时未显示指定数组中元素位置的情形下,占位符$用于识别元素的位置通过数组过滤条件找到的第一个匹配的元素值的文档将被更新
示例
情景描述
数据如下,这里要查看列表中年份为2018,id为100001的内容,假设该表表名为weilong_base,该表结构为TagInfo.java
@data
Class Video {
private int year;
private String title;
private double score;
public Video(title, score, year){
this.year = year;
this.score = score;
this.title = title;
}
}
{
"_id" : "100001",
"tag" : "民国",
"type" : "电影",
"videos" : [
{
"year" : 2018,
"title" : "邪不压正",
"score" : 8.53
},
{
"year" : 2016,
"title" : "罗曼蒂克消亡史",
"score" : 7.7
},
]
}
cmd模式
db.getCollection('weilong_base').find({"_id":"100001","videos.year":2018},{"videos.$":1})
mongoTemplatemplate模式
Query query = new Query();
Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("_id").is("100001"), Criteria.where("videos.year").is(2018));
query.fields().include("videos.$");
query.addCriteria(criteria);
TagInfo tagInfo = mongoTemplate.findOne(query, TagInfo.class, "weilong_base");
结果展示
{
"_id" : "100001",
"videos" : [
{
"year" : 2018,
"title" : "邪不压正",
"score" : 8.53
}
]
}
增加
$push
描述
添加一个指定的值到数组,如果是嵌套文档,使用.成员方式
示例
情景描述:
为id为100001的内容添加3组数据,按照score逆序排序
cmd模式
db.getCollection('weilong_base').update({"_id":"100001"},{
$push:{
videos:{
$each:[
{
"year" : NumberInt(2012),
"title" : "箭士柳白猿",
"score" : 7.2
},
{
"year" : NumberInt(2014),
"title" : "我不是王毛",
"score" : 7.8
},
{
"year" : NumberInt(1947),
"title" : "一江春水向东流",
"score" : 8.4
}],
$sort:{score:-1},
}
}
})
mongoTemplatemplate模式
目前暂未能找到插入多条并排序的代码测试,只能实现插入单条数据
Query query = new Query();
query.addCriteria(Criteria.where("_id").is("100001"));
Update update = new Update();
Video video1 = new Video("箭士柳白猿", 7.2, 2012);
Video video2 = new Video("我不是王毛", 7.8, 2014);
Video video3 = new Video("一江春水向东流", 8.4, 1947);
Video[] videos = new Video[]{video1, video2, video3};
update.push("videos", video1);
mongoTemplate.upsert(query, update, "weilong_base");
$addToSet
描述
当数组元素值不存在的时候,将该值添加到数组。否则,什么也不做。
示例
情景描述
添加一组数据,包含已经存在的值和新的值
cmd模式
db.getCollection('weilong_base').update({"_id":"100001"}, {
$addToSet:{
videos:{
$each:[
{
"year" : NumberInt(2012),
"title" : "箭士柳白猿",
"score" : 7.2
},
{
"year" : NumberInt(2014),
"title" : "黄金时代",
"score" : 7.1
}]
}
}
})
mongoTemplatemplate模式
目前也只能上传一条数据,多条暂未成功,另外还需要将自动生成的_class屏蔽掉_
Query query = new Query();
query.addCriteria(Criteria.where("_id").is("100001"));
Update update = new Update();
Video video1 = new Video("箭士柳白猿", 7.2, 2012);
Video video2 = new Video("我不是王毛", 7.8, 2014);
update.addToSet("videos", video1);
mongoTemplate.updateMulti(query, update, "weilong_base");
删除
$pop
描述
操作符移除数组中的第一个或者最后一个元素(1为最后一个元素,-1为第一个元素)
示例
情景描述
删除列表最后一个值
cmd模式
db.getCollection('weilong_base').update({"_id":"100001"},{$pop:{videos:1}})
mongoTemplatemplate模式
Query query = new Query();
query.addCriteria(Criteria.where("_id").is("100001"));
Update update = new Update();
update.pop("videos", Update.Position.LAST);
mongoTemplate.updateMulti(query, update, "weilong_base");
根据条件删除
情景描述
删除列表中符合某个条件的值
Update update = new Update();
Document doc = new Document();
doc.put("cid", vid);
update.pull("videos", doc);
Query query = new Query();
query.addCriteria(Criteria.where("videos.cid").is(vid));
mongoTemplate.updateMulti(query, update, "weilong_base");
$pull
描述
操作符从现有数组中移除与指定条件匹配的值或值的所有实例
示例
情景描述
删除掉score小于7.2,大于7的列表内容
cmd模式
db.getCollection('media_kbase_plugin_tags').update({"_id":"100001"},{
$pull:{
videos:{
score:{$gt:7},
score:{$lt:7.2}
}
}
})
mongoTemplatemplate模式
暂时还未能处理大于小于的问题
Query query = new Query();
query.addCriteria(Criteria.where("_id").is("100001"));
Update update = new Update();
Document doc = new Document();
doc.put("score", 7.2);
update.pull("videos", doc);
mongoTemplate.updateMulti(query, update, "weilong_base");
修改
$
描述
占位符$的作用主要是用于返回数组中第一个匹配的数组元素值,重点是第一个在更新时未显示指定数组中元素位置的情形下,占位符$用于识别元素的位置通过数组过滤条件找到的第一个匹配的元素值的文档将被更新
示例:
情景描述
修改score为7.2的列表内容
cmd模式
db.getCollection('media_kbase_plugin_tags').update(
{
"_id":"100001",
"videos":{
$elemMatch:{
score:7.2
}
}
},
{
$set:{"videos.$.year":NumberInt(2012)}
}
)
mongoTemplatemplate模式
Query query = new Query();
query.addCriteria(Criteria.where("_id").is("100001").and("videos.score").is(7.2));
Update update = new Update();
update.set("videos.$.year", 2013);
mongoTemplate.updateMulti(query, update, "weilong_base");
情景描述
修改score为7.2, title为邪不压正
的列表内容
cmd模式
db.getCollection('media_kbase_plugin_tags').update(
{
"_id":"100001",
"videos":{
$elemMatch:{
score:7.2,
title:"邪不压正"
}
}
},
{
$set:{"videos.$.year":NumberInt(2012)}
}
)
mongoTemplatemplate模式
Query query = new Query();
query.addCriteria(Criteria.where("_id").is("100001"));
Criteria criteria = new Criteria();
criteria.andOpterator(
Criteria.where("video").elemMatch(Criteria.where("score").is(7.2)),
Criteria.where("video").elemMatch(Criteria.where("title")).is("邪不压正")
);
Update update = new Update();
update.set("videos.$.year", 2013);
mongoTemplate.updateMulti(query, update, "weilong_base");