我正在使用spring MongoTemplate在mongodb上存储文档,其中包含需要不断添加的文档数组。
由于我希望能够首先查找最新的数组元素,所以我想在数组的开头插入新的数组元素。据说可以使用$ position运算符,所以我尝试编写这个查询:
final Query query = Query.query(Criteria.where("_id").is(docId));
Update update = new Update().push("docArray").atPosition(0).value(arrayElement);
mongoTemplate.findAndModify(query, update, new FindAndModifyOptions().upsert(true),
MyDocument.class, mongoDBConfig.MY_COLLECTION);
arrayElement对象成功插入到数组中,但是它被放置在最后一个位置而不是我想象的第一个位置。
虽然在检查Update对象时我确实在pushCommandBuilders修饰符列表中看到了“$ position”Update $ PositionModifier,但在尝试执行更新查询时,我没有看到操作符被添加到mappedUpdate DBObject中。我也尝试使用.atPosition(Position.FIRST)
,但它会产生相同的结果。
在阅读了一些之后,我意识到mongodb文档声明$ position修饰符必须与$ each修饰符一起使用(无论出于何种原因),所以我尝试了这样做:
Update update = new Update().push("docArray").atPosition(0).each(arrayElement);
这次它为mappedUpdate DBObject生成了这个查询:{ "$push" : { "docArray" : { "$position" : 0 , "$each" : [ {"object"}]}}}
,而不是在第一个位置添加数组元素,它只是将查询修饰符视为arrayElement对象的字段并生成此代替:
{
"_id" : "id",
"docArray" :
[
...
,{"$position" : 0,
"$each" : [{arrayElement}]
}
]
}
我做错了什么或者这是MongoTemplate的错误?我知道还有其他方法可以先获得最新的数组项,但这种方法看起来效率最高,所以我想尽可能使用它。