mongoTemplate操作内嵌文档
关系型数据库中,表与表的关联关系有1:1,也有1:n的。在java的面向对象的世界里就是主对象嵌子对象,与主对象嵌集合<子对象>的两种形式。
主对象嵌子对象操作:
新增、修改都直接用如下方法:
mongoTemplate.updateFirst(new Query(criteria), update, clazz, collectionName);
删除:(删除内嵌对象列即可)
update.unset(columnName + ".$");
WriteResult updateFirst = mongoTemplate.updateFirst(query, update, clazz, collectionName);
主对象嵌集合<子对象>的操作:
java对象的例子:
{
"_id" : "195861",
"tags" : [
{
"tagId" : NumberLong(766),
"optDate" : ISODate("2013-08-12T15:21:02.930Z"),
"enable" : true
},
{
"tagId" : NumberLong(778),
"optDate" : ISODate("2013-08-12T15:21:02.930Z"),
"enable" : true
}
]
}
MongoTemplate操作的示例:
/**
**给tags数组添加一个元素
*/
@Override
public Response<Integer> addTag(String id, Long tagId) { try {
Tag tag = new Tag(tagId);
tag.setOptDate(new Date());
tag.setEnable(true);
Query query = Query.query(Criteria.where("_id").is(id));
Update update = new Update();
update.addToSet("tags", tag);
mongoTemplate.upsert(query, update, User.class);
} catch (Exception e) {
return new Response<Integer>(0);
}
return new Response<Integer>(1);
} /**
**修改tags数组中内嵌文档指定一个元素的值
*/
@Override
public Response<Integer> disableTag(String id, Long tagId) { try {
Query query = Query.query(Criteria.where("_id").is(id)
.and("tags.tagId").is(tagId));
Update update = new Update();
update.set("tags.$.enable", false);
mongoTemplate.updateFirst(query, update, User.class);
} catch (Exception e) {
return new Response<Integer>(0);
}
return new Response<Integer>(1);
}
/**
**删除tags数组中指定的内嵌文档
*/
@Override
public Response<Integer> removeTag(String id, Long tagId) { try {
Query query = Query.query(Criteria.where("_id").is(id)
.and("tags.tagId").is(tagId));
Update update = new Update();
update.unset("tags.$");
mongoTemplate.updateFirst(query, update, User.class);
} catch (Exception e) {
return new Response<Integer>(0);
} return new Response<Integer>(1);
}
update.unset这种方法有一个缺陷,会将符合条件的数据修改成null,如果要彻底删除,则需要使用pull(pull删除内嵌文档的时候,student对象的值一定要和被删除的一模一样(不懂))
Query query = Query.query(Criteria.where("classId").is("1"));
Update update = new Update();
Student student = new Student("2","lisi",18,"man");
update.pull("Students",student);
mongoTemplate.updateFirst(query, update, "class");
pull方式删除内嵌文档中的行:
Query query = Query.query(Criteria.where("_id").is(id));
BasicDBObject s = new BasicDBObject();
s.put("tagId", tagid);
Update update = new Update();
update.pull("tags", s);
mongoTemplate.updateFirst(query, update, User.class);
嵌套对象的查询:
这里需要注意下,如果返回的数据列表是整个对象(外对象+内嵌对象)时,内嵌对象的所有行都会被返回,只有返回值对象指定为内嵌对象时,才能过滤掉内嵌对象集合中不符合条件的记录。
db.getCollection('tz_member').find({"memberPhotos.memberId":'4'},{"memberPhotos.$":1}).pretty();
db.getCollection('tz_member').find({"member_id":"3","memberPhotos.memberId":{'$in':['4']}},{"memberPhotos.$":1}).pretty();
内嵌文档的主键问题
MongoDB CRUD操作(insert,update,find,remove)所有的操作都只在顶级文档上进行--当然,可以按嵌入文档中的字段进行筛选。嵌入文档总是在父文档中返回。
_id字段是父文档的必需字段,通常在嵌入文档中不需要或不存在。如果需要唯一标识符,当然可以创建它们,并且可以使用_id字段来存储它们,如果这对代码或心智模型来说是方便的话;更典型的是,它们是以它们所代表的名称命名的(例如“用户名”、“其他SystemKey”等等)。MongoDB本身和任何驱动程序都不会自动填充_id字段,但顶层文档除外。
特别是在Java中,如果希望为_id在嵌入式文档中,可以使用以下方法来完成:
someEmbeddedDoc._id = new ObjectId();
mongoTemplate操作内嵌文档的更多相关文章
- mongodb对数组元素及内嵌文档进行增删改查操作(转)
from:https://my.oschina.net/132722/blog/168274 比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: &l ...
- MongoDB对数组元素及内嵌文档进行增删改查操作
比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: { "_id" : "195861", &qu ...
- MongoDB内嵌文档操作
实体定义: [BsonIgnoreExtraElements] public class Person : BaseEntity { public string FirstName { get; se ...
- mongodb内嵌文档的查询
本文转自:http://blog.163.com/wm_at163/blog/static/1321734902012526103825481/ 1 > db.blog.findOne() { ...
- mongodb内嵌文档的javaapi,增删改查
数据结构: {"_id" : "000000001", //Mongodb默认主键 "UID" : "000000001&quo ...
- 学习MongoDB 五: MongoDB查询(数组、内嵌文档)(二)
一.简介 我们上一篇介绍了db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段,我们今天介绍了对数组和内嵌文档的查询操作,尤其是 ...
- MongoDB-4: 查询(二-数组、内嵌文档)
一.简介 我们上一篇介绍了db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段,我们今天介绍了对数组和内嵌文档的查询操作,尤其是 ...
- MongoDB 内嵌文档
MongoDB是文档型的数据库系统,doc是MongoDB的数据单位,每个doc相当于关系型数据库的数据行(row),doc和row的区别在于field的原子性:row中的column是不和分割的原子 ...
- mongodb查询内嵌文档
mongodb查询内嵌文档 假设有这样一个文档: db.XXX.remove(); db.XXX.insert({"id":1, "members":[{& ...
随机推荐
- python 中文字符的处理
刚开始学习python的时候,都是对这英文的翻译书学习的.没有解除到中文编码的相关问题,直到自己用python去做相关的项目的时候才发先中文编码问题真的非常头疼啊.这里分享一下本人所了解的一些经验. ...
- Windows Server 2008 IIS的备份和还原
Windows Server 2008 IIS的备份和还原 当我们服务器系统有大量的站点和虚拟目录的时候,因为种种原因需要重做系统,那么重装系统后这些站点我们是否只能一个一个的添加,如果有成百上千个站 ...
- springmvc-restful
1.restful概述 REST 仅仅是一种架构的风格,并不是真正的架构,也不是一个软件,而是一种思想. 我们可以基于现有的HTTP.URI.XML.等现有技术来实现REST的风格.而不用去学习任何新 ...
- 键盘高级操作技巧【TLCL】
Ctrl-a 移动光标到行首. Ctrl-e 移动光标到行尾. Ctrl-f 光标前移一个字符:和右箭头作用一样. Ctrl-b 光标后移一个字符:和左箭头作用一样. ...
- java的一些基本格式
书写方法的格式: 修饰符 返回值 方法名 方法体 public int/void addNumber(参数) { ...
- 10.0.4_CentOS_120g
对应 VMware Workstation 版本为:“10.0.4 build-2249910”
- python基础6 - while 循环与转义字符
8. while 循环基本使用 8.1 while 语句基本语法 初始条件设置 —— 通常是重复执行的 计数器 while 条件(判断 计数器 是否达到 目标次数): 条件满足时,做的事情1 条件满足 ...
- Maven知识点简要
1.依赖管理 <dependencies> <dependency> <groupId>net.sf.json-lib</groupId> < ...
- Java tutorial 02
一.EnumTest.java枚举类型 public class EnumTest { public static void main(String[] args) { Size s=Size.SMA ...
- hdu-1863-畅通工程(kruskal算法模板)
题目链接 /* Name:hdu-1863-畅通工程 Copyright: Author: Date: 2018/4/18 10:19:03 Description: kruskal算法 */ #i ...