Spring MongoTemplate atPosition()不起作用

时间:2015-06-30 20:49:55

标签: spring mongodb spring-data-mongodb

我正在使用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的错误?我知道还有其他方法可以先获得最新的数组项,但这种方法看起来效率最高,所以我想尽可能使用它。

0 个答案:

没有答案