我有一组用户:
> db.users.find().pretty()
{
"_id" : ObjectId("544ab933e4b099c3cfb62e12"),
"token" : "8c9f8cf4-1689-48ab-bf53-ee071a377f60",
"categories" : [
DBRef("cue_categories", ObjectId("544ab933e4b099c3cfb62e10")),
DBRef("cue_categories", ObjectId("544ab933e4b099c3cfb62e11"))
]
}
我想找到所有拥有(让我们说)ObjectId("544ab933e4b099c3cfb62e10")
类别的用户并将其删除(因为此类别已被删除,我不希望用户再参考它)。
以JSON格式执行此操作的有效查询将是:
db.users.update({
categories:{
$in:[
DBRef("cue_categories", ObjectId("544ab933e4b099c3cfb62e10"))
]
}
},
{
$unset:{
"categories.$":true
}
})
这是一个Spring mongodb查询:
Query query = new Query();
query.addCriteria(Criteria.where("categories.$id").in(categoryIds));
Update update = new Update();
update.unset("categories.$");
operations.updateMulti(query, update, User.class);
为了制作适当的数据库引用,我必须提供类别ID列表,每个类别ID(categoryIds
)都是org.bson.types.ObjectId
的实例。
问题是结果查询结果是没有位置运算符:
DEBUG o.s.data.mongodb.core.MongoTemplate - 使用调用更新 查询:{“categories。$ id”:{“$ in”:[{“$ oid”: “544ab933e4b099c3cfb62e10”}]}}并更新:{“$ unset”:{“categories” :1}}在集合中:用户
因此更新部分必须为{ "$unset" : { "categories.$" : 1}}
P.S。 我设法通过回到普通的Java驱动程序使用
来解决DBObject query = new BasicDBObject("categories.$id", new BasicDBObject("$in", categoryIds));
DBObject update = new BasicDBObject("$unset", new BasicDBObject("categories.$", true));
operations.getCollection("users").updateMulti(query, update);
但我的问题仍然存在!
P.S.S。
我的情况与Update Array Field Using Positional Operator ($) Does Not Work错误非常相似,看起来修复版 1.4.1 和 1.5 。话虽如此,我使用spring-data-mongodb
version 1.5.1。我很困惑。有人有线索吗?
答案 0 :(得分:0)
根据 MongoDB 文档,您不能使用未设置的位置 $ 运算符。它会将值设置为 Null。 https://docs.mongodb.com/manual/reference/operator/update/positional/