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

https://my.oschina.net/132722/blog/168274


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

<!-- lang: js -->
{
    "_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类。代码删除和修改本身就包含查询方法,所以没写查询方法

代码如下:

<!-- lang: java -->
/**
 * 
 * @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;
}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值