Mongodb操作内嵌列表

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");
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值