zoukankan      html  css  js  c++  java
  • 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操作(insertupdatefindremove)所有的操作都只在顶级文档上进行--当然,可以按嵌入文档中的字段进行筛选。嵌入文档总是在父文档中返回。

    _id字段是父文档的必需字段,通常在嵌入文档中不需要或不存在。如果需要唯一标识符,当然可以创建它们,并且可以使用_id字段来存储它们,如果这对代码或心智模型来说是方便的话;更典型的是,它们是以它们所代表的名称命名的(例如“用户名”、“其他SystemKey”等等)。MongoDB本身和任何驱动程序都不会自动填充_id字段,但顶层文档除外。

    特别是在Java中,如果希望为_id在嵌入式文档中,可以使用以下方法来完成:

    someEmbeddedDoc._id = new ObjectId();



  • 相关阅读:
    s3c2440 nand flash 拷贝实验
    DE270数字系统设计(4)基于Nios的LCD显示
    DE270数字系统设计实验(3)移位寄存器
    s3c2440启动时的内存拷贝过程分析
    s3c2440基本io/ports led点亮
    (转)X11/Xlib.h:没有该文件或目录
    NAND Flash读写技术
    Http中ContentType的取值讲解
    Json对象和Json字符串的区别
    table() function
  • 原文地址:https://www.cnblogs.com/duanxz/p/3566221.html
Copyright © 2011-2022 走看看