博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mongoTemplate更新一个Document里面的数组的一个记录。
阅读量:5298 次
发布时间:2019-06-14

本文共 5028 字,大约阅读时间需要 16 分钟。

假如有一个Document如下:

{    "_id" : "69bca85a-5a61-4b04-81fb-ff6a71c3802a",    "_class" : "cn.com.chinacloud.paas.mir2.application.model.bo.ApplicationInstanceBO",    "slug" : "shawn-shawn-mysql-1",    "version" : "1",    "name" : "shawn-mysql-1",    "status" : "UNHEALTHY",    "resourceTask" : {        "task" : "DEPLOY",        "taskResult" : "DEPLOY_TIMEOUT"    },    "totalElementNum" : 1,    "totalCellNum" : 1,    "subElementNum" : 1,    "elementInstanceBOs" : [         {            "_id" : "1347580a-02a1-41a6-9d29-c78850f948b5",            "slug" : "shawn-shawn-mysql-1-mysql",            "name" : "mysql",            "namespace" : "shawn",            "status" : "STARTING",            "totalCellNum" : 1,            "runningCellNum" : 0,            "imageName" : "172.16.71.199/common/mysql",            "imageVersion" : "5.6",            "intranetAccessURL" : [                 {                    "_id" : null,                    "address" : "shawn-mysql-1-mysql.shawn",                    "proxyPort" : 3306,                    "targetPort" : 3306                }            ],            "internetAccessURL" : [                 {                    "_id" : null,                    "address" : "172.16.71.200",                    "targetPort" : 3306                }            ]        }    ],    "applicationId" : "c27dbb31-20e9-40a2-94d9-e6a2df661604",    "dependencyInstances" : [],    "canStart" : false,    "canStopAndReBuild" : false}

如果想要更新上面的紫色的status,由于elementInstanceBOs是数组结构,想要更新具体哪一个,可以用$表示数组的下标。

Query query = new Query(Criteria.where("elementInstanceBOs.slug").is(pSlug));        Update update = new Update().set("elementInstanceBOs.$.status", pElementInstanceStatusEnum)                .set("elementInstanceBOs.$.runningCellNum", runningCell);        mongoTemplate.updateFirst(query, update, ApplicationInstanceBO.class);

在上面的语句当中,Criteria.where("elementInstanceBOs.slug").is(pSlug)选择条件返回的是整个document,但是具体更新数组里面的哪个一还是得用下标$来表示。

mongoDB中数组的其他操作:

查看一个文档的一个键值comments为一个数组[“test1”,”test2”]:

1
2
3
4
5
6
7
8
9
10
11
12
> db.post.findOne({
"id"
:1})   
{    
    
"_id" 
: ObjectId(
"54a530c3ff0df3732bac1680"
),    
    
"id" 
: 1,    
    
"name" 
"joe"
,    
    
"age" 
: 21,    
    
"comments" 
: [    
        
"test1"
,    
        
"test2"    
    
]    
}    
>

 

一、$push向数组末尾添加元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> db.post.update({
"id"
:1},{$push:{
"comments"
"test3"
}})   
WriteResult({ 
"nMatched" 
: 1, 
"nUpserted" 
: 0, 
"nModified" 
: 1 })    
> db.post.findOne({
"id"
:1})    
{    
    
"_id" 
: ObjectId(
"54a530c3ff0df3732bac1680"
),    
    
"id" 
: 1,    
    
"name" 
"joe"
,    
    
"age" 
: 21,    
    
"comments" 
: [    
        
"test1"
,    
        
"test2"
,    
        
"test3"    
    
]    
}    
>
Query query = new Query( Criteria.where("id").is(id);        Update update = new Update().push("comments", 'test3');

 

    

使用$each一次性添加多个值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> db.post.update({
"id"
:1},{$push:{
"comments"
:{$each:[
"test4"
,
"test5"
,
"test6"
]}}})   
WriteResult({ 
"nMatched" 
: 1, 
"nUpserted" 
: 0, 
"nModified" 
: 1 })    
> db.post.findOne({
"id"
:1})    
{    
    
"_id" 
: ObjectId(
"54a530c3ff0df3732bac1680"
),    
    
"id" 
: 1,    
    
"name" 
"joe"
,    
    
"age" 
: 21,    
    
"comments" 
: [    
        
"test1"
,    
        
"test2"
,    
        
"test3"
,    
        
"test4"
,    
        
"test5"
,    
        
"test6"    
    
]    
}    
>
Query query = new Query( Criteria.where("id").is(id);        List
list=new ArrayList
(); list.add("test3"); list.add("test4"); list.add("test4"); Update update = new Update().pushAll("comments", list);

 

二、用$pop删除数组中的元素

从数组末尾删除一个值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> db.post.update({
"id"
:1},{$pop:{
"comments"
:1}})   
WriteResult({ 
"nMatched" 
: 1, 
"nUpserted" 
: 0, 
"nModified" 
: 1 })    
> db.post.findOne({
"id"
:1})    
{    
    
"_id" 
: ObjectId(
"54a530c3ff0df3732bac1680"
),    
    
"id" 
: 1,    
    
"name" 
"joe"
,    
    
"age" 
: 21,    
    
"comments" 
: [    
        
"test1"
,    
        
"test2"
,    
        
"test3"
,    
        
"test4"
,    
        
"test5"    
    
]    
}

从数组开头删除一个值:   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> db.post.update({
"id"
:1},{$pop:{
"comments"
:-1}})    
WriteResult({ 
"nMatched" 
: 1, 
"nUpserted" 
: 0, 
"nModified" 
: 1 })    
> db.post.findOne({
"id"
:1})    
{    
    
"_id" 
: ObjectId(
"54a530c3ff0df3732bac1680"
),    
    
"id" 
: 1,    
    
"name" 
"joe"
,    
    
"age" 
: 21,    
    
"comments" 
: [    
        
"test2"
,    
        
"test3"
,    
        
"test4"
,    
        
"test5"    
    
]    
}    
>

三、删除数组中一个指定的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> db.post.update({
"id"
:1},{$pull:{
"comments"
:
"test3"
}})   
WriteResult({ 
"nMatched" 
: 1, 
"nUpserted" 
: 0, 
"nModified" 
: 1 })    
> db.post.findOne({
"id"
:1})    
{    
    
"_id" 
: ObjectId(
"54a530c3ff0df3732bac1680"
),    
    
"id" 
: 1,    
    
"name" 
"joe"
,    
    
"age" 
: 21,    
    
"comments" 
: [    
        
"test2"
,    
        
"test4"
,    
        
"test5"    
    
]    
}    
>

java程序:

Query query = new Query( Criteria.where("_id").is(id);        Update update = new BasicUpdate("{'$pull':{'comments':'test4'}}");        mongoTemplate.updateFirst(query, update, Post.class);

 

 

四、基于数组下标位置修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> db.post.update({
"id"
:1},{$
set
:{
"comments.1"
:
"test9"
}})   
WriteResult({ 
"nMatched" 
: 1, 
"nUpserted" 
: 0, 
"nModified" 
: 1 })    
> db.post.findOne({
"id"
:1})    
{    
    
"_id" 
: ObjectId(
"54a530c3ff0df3732bac1680"
),    
    
"id" 
: 1,    
    
"name" 
"joe"
,    
    
"age" 
: 21,    
    
"comments" 
: [    
        
"test2"
,    
        
"test9"
,    
        
"test5"    
    
]    
}    
>

 

转载于:https://www.cnblogs.com/boshen-hzb/p/7115626.html

你可能感兴趣的文章
把word文档中的所有图片导出
查看>>
Spring 自动装配;方法注入
查看>>
浏览器的判断;
查看>>
ubuntu 18.04取消自动锁屏以及设置键盘快捷锁屏
查看>>
uva 10791
查看>>
python的字典(dict)的键值对存储规则
查看>>
more 分页显示文件内容
查看>>
ubuntu18 tensorflow cpu fast_rcnn
查看>>
PageHelper在Mybatis中的使用
查看>>
POJ 1742 Coins
查看>>
Leetcode 589. N-ary Tree Preorder Traversal
查看>>
ADO.Net——增、删、改、查
查看>>
thinking back no11
查看>>
机器学习/深度学习/其他开发环境搭建记录
查看>>
xml.exist() 实例演示
查看>>
判断是否为空然后赋值
查看>>
中标麒麟QT+ODBC+人大金仓开发环境配置
查看>>
Silverlight WCF RIA服务(九)Domain Service 2
查看>>
JSON的结构
查看>>
NopCommerce换主题这件小事
查看>>