from: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;
}
}