Spring Data MongoDB:从更新中排除字段

8
如何确保在创建时可以插入特定字段,但在更新对象时可以选择排除这些字段。 我基本上正在寻找以下内容:
mongoOperations.save(theObject, <fields to ignore>)

据我所见,最近引入的@ReadOnlyProperty会在插入和更新时都忽略该属性。

我可以通过实现自定义的MongoTemplate并覆盖其doUpdate方法来获得所需的行为,如下所示:

@Override
protected WriteResult doUpdate(String collectionName, Query query,
        Update originalUpdate, Class<?> entityClass, boolean upsert, boolean multi) {

    Update updateViaSet = new Update();

    DBObject dbObject = originalUpdate.getUpdateObject();
    Update filteredUpdate = Update.fromDBObject(dbObject, "<fields to ignore>");

    for(String key : filteredUpdate.getUpdateObject().keySet()){

        Object val = filteredUpdate.getUpdateObject().get(key);

        System.out.println(key + "::" + val);

        updateViaSet.set(key, filteredUpdate.getUpdateObject().get(key));
    }

    return super
            .doUpdate(collectionName, query, updateViaSet, entityClass, upsert, multi);
}

但问题在于现在它会对所有内容使用Mongo $set形式的更新,而不仅仅是特定情况。请指导是否有更简单(且正确)的方法来实现这一点。
1个回答

1
在创建更新对象时,请使用$setOnInsert而不是$set。它在Spring Mongo中也可用。
如果具有upsert:true的更新操作导致插入文档,则$setOnInsert会将指定的值分配给文档中的字段。如果更新操作没有导致插入,则$setOnInsert不执行任何操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接