我有这个文件:
{
"_id" : ObjectId("5a698b8bc2539428e3738c7d"),
"_class" : "com.xxx.xxx.inf.dao.mongo.domain.IndexDO",
"product_id" : "5a67fde8c2539414b9712482",
"cn_name" : "index - test",
"en_name" : "test index - test",
"sample_desc" : "this is a sample description",
"people_type" : 1,
"ref_literature" : [
{
"_class" : "com.xxx.xxx.inf.dao.mongo.domain.RefLiterature",
"_id" : null,
"name" : "ref 1"
},
{
"_class" : "com.xxx.xxx.inf.dao.mongo.domain.RefLiterature",
"_id" : null,
"name" : "ref 2"
}
],
"user_id" : 6,
"gmt_create" : ISODate("2018-01-25T07:47:23.800+0000"),
"detail_desc" : null,
"gmt_modified" : ISODate("2018-01-25T07:49:50.923+0000"),
"index_level" : [
{
"_class" : "com.xxx.xxx.inf.dao.mongo.domain.IndexLevel",
"_id" : ObjectId("5a72c83050abd32e7e54340d"),
"up_val" : "3.2",
"down_val" : "5.7",
"calc_symbol_type" : 2,
"level_desc" : "this is a test level desc"
}
]
}
我想删除index_level中的元素,这里是:
{
"_class" : "com.xxx.xxx.inf.dao.mongo.domain.IndexLevel",
"_id" : ObjectId("5a72c83050abd32e7e54340d"),
"up_val" : "3.2",
"down_val" : "5.7",
"calc_symbol_type" : 2,
"level_desc" : "this is a test level desc"
}
我可以使用以下命令在mongo shell中删除此子文档:
db.index.update(
{"_id":ObjectId("5a698b8bc2539428e3738c7d")},
{$pull:{"index_level": {"_id":ObjectId("5a72c83050abd32e7e54340d")}}}
)
但是当我在下面删除使用mongotemplate代码时,我没有这样做:
mongoTemplate.updateFirst(
Query(Criteria.where("_id").`is`(ObjectId("5a698b8bc2539428e3738c7d"))),
Update().pull("index_level", Query(Criteria.where("_id").`is`(ObjectId("5a72c83050abd32e7e54340d")))),
IndexDO::class.java
)
并尝试下面的代码:
mongoTemplate.updateFirst(
Query(Criteria.where("_id").`is`(ObjectId("5a698b8bc2539428e3738c7d")).and("index_level._id").`is`(ObjectId("5a72c83050abd32e7e54340d"))),
Update().pull("index_level", Query(Criteria.where("_id").`is`(ObjectId("5a72c83050abd32e7e54340d")))),
IndexDO::class.java
)
最后,我可以使用以下代码删除此子文档:
mongoTemplate.updateFirst(
Query(Criteria.where("index_level._id").`is`(ObjectId("5a72c83050abd32e7e54340d"))),
Update().pull("index_level", Query(Criteria.where("_id").`is`(ObjectId("5a72c83050abd32e7e54340d")))),
IndexDO::class.java)
但是这段代码有问题,因为在这里位置字段是_id
,当我更改位置字段时,如“calc_symbol_type”,最终代码将删除所有calc_symbol_type
等于值我发送给方法。
所以问题是我错了吗?而mongo shell命令转换为mongotemplate代码将是什么?
谢谢!