更新查询中的 MongoTemplate 确定性顺序
MongoTemplate deterministic order in update query
我在 Spring 批处理编写器中使用 MongoTemplate,我想使用 $addToSet
运算符将我的元素推送到数组中,前提是它们尚不存在。
我在 Mongodb 文档中看到 $addToSet
只有在字段顺序相同时才有效 。
所以我的问题是:MongoTemplate 是否总是以相同的顺序将我的 pojo 转换为 Bson 文档?
我在 MongoTemplate 的代码 (MappingMongoConverter
) 中找到了这个转换器,对我来说循环不是确定性的:
private void writeProperties(Bson bson, MongoPersistentEntity<?> entity, PersistentPropertyAccessor<?> accessor,
DocumentAccessor dbObjectAccessor, @Nullable MongoPersistentProperty idProperty) {
// Write the properties
for (MongoPersistentProperty prop : entity) {
if (prop.equals(idProperty) || !prop.isWritable()) {
continue;
}
if (prop.isAssociation()) {
writeAssociation(prop.getRequiredAssociation(), accessor, dbObjectAccessor);
continue;
}
Object value = accessor.getProperty(prop);
if (value == null) {
continue;
}
if (!conversions.isSimpleType(value.getClass())) {
writePropertyInternal(value, dbObjectAccessor, prop);
} else {
writeSimpleInternal(value, bson, prop);
}
}
}
Spring Mongo @Field
批注允许明确设置每个字段的顺序。
我的一些 POJO 有 1000 个字段,在我的情况下这是一个费力的解决方案,但它是一个解决方案。
如果有人知道更简单的方法,我将不胜感激:)
我在 Spring 批处理编写器中使用 MongoTemplate,我想使用 $addToSet
运算符将我的元素推送到数组中,前提是它们尚不存在。
我在 Mongodb 文档中看到 $addToSet
只有在字段顺序相同时才有效 。
所以我的问题是:MongoTemplate 是否总是以相同的顺序将我的 pojo 转换为 Bson 文档?
我在 MongoTemplate 的代码 (MappingMongoConverter
) 中找到了这个转换器,对我来说循环不是确定性的:
private void writeProperties(Bson bson, MongoPersistentEntity<?> entity, PersistentPropertyAccessor<?> accessor,
DocumentAccessor dbObjectAccessor, @Nullable MongoPersistentProperty idProperty) {
// Write the properties
for (MongoPersistentProperty prop : entity) {
if (prop.equals(idProperty) || !prop.isWritable()) {
continue;
}
if (prop.isAssociation()) {
writeAssociation(prop.getRequiredAssociation(), accessor, dbObjectAccessor);
continue;
}
Object value = accessor.getProperty(prop);
if (value == null) {
continue;
}
if (!conversions.isSimpleType(value.getClass())) {
writePropertyInternal(value, dbObjectAccessor, prop);
} else {
writeSimpleInternal(value, bson, prop);
}
}
}
Spring Mongo @Field
批注允许明确设置每个字段的顺序。
我的一些 POJO 有 1000 个字段,在我的情况下这是一个费力的解决方案,但它是一个解决方案。 如果有人知道更简单的方法,我将不胜感激:)