Spring数据mongodb从“$ unset”更新查询部分中删除位置运算符

时间:2014-10-24 21:25:06

标签: java spring spring-data-mongodb

我有一组用户:

> 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。我很困惑。有人有线索吗?

1 个答案:

答案 0 :(得分:0)

根据 MongoDB 文档,您不能使用未设置的位置 $ 运算符。它会将值设置为 Null。 https://docs.mongodb.com/manual/reference/operator/update/positional/