MongoDB和Spring Data-具有组的聚合返回不正确的ID

我有以下MongoDB文档:

@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@accessors(chain = true)
@SuperBuilder
@Document(collection = ReasonDocument.COLLECTION)
public class ReasonDocument extends BaseDocument<ObjectId> {
  public static final String COLLECTION = "reasons";

  @Id
  private ObjectId id;
  @Indexed
  private ObjectId ownerId;
  @Indexed
  private LocalDate date;
  private Type type;
  private String reason;
}

我想获取ownerId中所有带有最新date的行,并另外过滤掉其中一些。我为此编写了自定义存储库,在其中将聚合与组语句一起使用:

public class ReasonsRepositoryImpl implements ReasonsRepository {

  private final MongoTemplate mongoTemplate;

  @Autowired
  public ReasonsRepositoryImpl(MongoTemplate mongoTemplate) {
    this.mongoTemplate = mongoTemplate;
  }

  public List<ReasonDocument> findReasons(LocalDate date) {
    final Aggregation aggregation = Aggregation.newAggregation(
      sort(Direction.DESC,"date"),group("ownerId")
        .first("id").as("id")
        .first("reason").as("reason")
        .first("type").as("type")
        .first("date").as("date")
        .first("ownerId").as("ownerId"),match(Criteria.where("date").lte(date).and("type").is(Type.TYPE_A))
    );
    return mongoTemplate.aggregate(aggregation,"reasons",ReasonDocument.class).getMappedResults();
  }
}

这是一个聪明的查询,但不幸的是,它在测试时返回了损坏的行:

java.lang.AssertionError: 
Expecting:
  <[ReasonDocument(id=5dd5500960483c1b2d974eed,ownerId=5dd5500960483c1b2d974eed,date=2019-05-14,type=TYPA_A,reason=14),ReasonDocument(id=5dd5500960483c1b2d974ee8,ownerId=5dd5500960483c1b2d974ee8,date=2019-05-15,reason=1)]>
to contain exactly in any order:
  <[ReasonDocument(id=5dd5500960483c1b2d974eef,reason=1),ReasonDocument(id=5dd5500960483c1b2d974efc,reason=14)]>
elements not found:
  <[ReasonDocument(id=5dd5500960483c1b2d974eef,reason=14)]>
and elements not expected:
  <[ReasonDocument(id=5dd5500960483c1b2d974eed,reason=1)]>

返回的idownerId相同。
谁能说出查询出了什么问题?

exchange456 回答:MongoDB和Spring Data-具有组的聚合返回不正确的ID

我不确定是否可能是问题所在。但是您是否检查过mongo如何保存ID?因为即使您是按ownerID分组的。如果mongo已将项目保存在Json的_id标头下。然后您需要将其称为_id

例如:如果是这样

{  “ _id”:“ 2893u4jrnjnwfwpfn”,  “名称”:“詹金斯” }

然后,您的groupBy应该是groupBy(_id),而不是您编写的内容。

,

除非我不了解某些情况,否则这恰好是MongoDB和ORM的限制。

根据文档https://docs.mongodb.com/manual/reference/operator/aggregation/group/,本地mongo查询如下所示:

{
  $group:
    {
      _id: <expression>,// Group By Expression
      <field1>: { <accumulator1> : <expression1> },...
    }
 }

因此分组本身会创建新的_id-如果我按ownerId分组,则该值将最终出现在_id字段中。

解决此问题的一种方法是使用:

    .first("_id").as("oldId")

并使用oldId作为字段创建新类型,以后可以用来映射回原始文档。

本文链接:https://www.f2er.com/3065140.html

大家都在问