MongoDB对数组元素及内嵌文档进行增删改查操作

比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下:

{
    "_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
            }
    ]

}

下面对这个文档中的tag进行增删该查操作,这里用到了spring mongodb 里面的MongoTemplate类。我这里把tags里的内嵌文档抽象成了Tag类。代码删除和修改本身就包含查询方法,所以没写查询方法

代码如下:

/**
 *
 * @author zhangdonghao
 *
 */
@Component("UserrTagServiceImpl")
public class UserrTagServiceImpl implements UserrTagService {

/**
 * Mongo DB Spring Template
 */
@Resource
protected MongoTemplate mongoTemplate = null;

public UserrTagServiceImpl() {

}
/**
**给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);
}

public MongoTemplate getMongoTemplate() {
    return mongoTemplate;
}

public void setMongoTemplate(MongoTemplate mongoTemplate) {
    this.mongoTemplate = mongoTemplate;
}
}

原文地址:https://www.linuxidc.com/Linux/2013-11/92408.htm

原文地址:https://www.cnblogs.com/sank/p/11371588.html

时间: 2024-10-25 00:37:55

MongoDB对数组元素及内嵌文档进行增删改查操作的相关文章

mongodb对数组元素及内嵌文档进行增删改查操作(转)

from:https://my.oschina.net/132722/blog/168274 比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: <!-- lang: js --> { "_id" : "195861", "tags" : [ { "tagId" : NumberLong(766), "optDate" : ISODate(&qu

mongodb的学习笔记一(集合和文档的增删改查)

1数据库的增删改查 一.增加一个数据库: use blog-----切换到指定的数据库,如果数据库不存在,则自动创建该数据库(新建的数据库,如果没有存储对应的集合,是不会显示出来的) 二.删除一个数据库 1首先用use 切换到你需要删除的数据库 use test 2然后执行db.dropDatabase()命令 db.dropDatabase() 三.修改一个数据库的名字 db.copyDatabase(fromdb, todb, fromhost) fromdb:源数据库, todb:目标数据

MongoDB 如何查询和修改内嵌文档

MongoDB是文档型的数据库系统,doc是MongoDB的数据单位,每个doc相当于关系型数据库的数据行(row),doc和row的区别在于field的原子性:row中的column是不和分割的原子对象,而doc中的field可以是原子对象,也可以是内嵌doc(embedded doc),数组等数据类型.内嵌doc中所有field的Key不允许重复. 例如以下doc,contact 字段是内嵌doc. oneDoc= { name:"t1", age:21, contact: { p

分布式搜索elasticsearch 索引文档的增删改查 入门

1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful接口URL的格式: http://localhost:9200/<index>/<type>/[<id>] 其中index.type是必须提供的. id是可选的,不提供es会自动生成. index.type将信息进行分层,利于管理. index可以理解为数据库:type理解为数据表:id相当于数据库表中记录的主键,是唯一的. 2.索引文

Mongodb的基本操作-数据库 集合 文档的增删改查

数据库操作: //查看有哪些数据库 > show dbs local  0.078GB mydb   0.078GB //use操作将切换到一个数据库 如果数据库存在将直接切换 如果不存在 那么会在切换之后,第一次执行新增修改操作的时候去创建这个数据库 > use newdb switched to db newdb //此时还没有创建 > show dbs local  0.078GB mydb   0.078GB > db.persion.insert({age:10}) Wr

文档的增删改查

增加文档: 方法1: db.collection.insert({}) 插入单个文档 db.collection.insertOne({}) 插入当个文档 db.collection.insert([{},{},{}]) 插入多个文档,参数用中括号 db.collection.insertMany([{},{}]) 也是插入多个文档 e.g. db.class0.insert({'name':"Lucy","age":18}) e.q. db.class0.inse

MongoDB 文档字段增删改

MongoDB 基于CRUD(create,read,update,delete)方式实现了对集合上的文档进行增删改查.对于集合上字段的增删改,可以使用set或者unset修改器来实现.也可以使用文档替换的方式来实现.本文主要描述集合上字段的增删改,以及基于选项upsert的更新. a.语法描述 db.collection.update( <query>,                  //查询或过滤条件 <update>,                 //修改器(被修改键

学习MongoDB 五: MongoDB查询(数组、内嵌文档)(二)

一.简介 我们上一篇介绍了db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段,我们今天介绍了对数组和内嵌文档的查询操作,尤其是对$elemMatch 同样可以用在find方法的第二个参数来限制返回数组内的元素,只返回我们需要的文档的介绍.我们经常在查询条件查询内嵌文档数组时,只需要返回主文档并返回内嵌文档数组中我们只需要的值,而不是把内嵌文档的数组都返回. 二.对数组根据条件查询  $all.$size.$slice.$e

MongoDB查询内嵌文档

有文档如下: /* 0 */ { "_id" : ObjectId("55d09915331c571b60035d95"), "title" : "hello world", "comment" : [{ "author" : "joe", "score" : 3 }, { "author" : "tom",