Mongo spring查询两个字段相等的地方

时间:2015-08-12 08:38:01

标签: java spring mongodb

我想在java中执行一个查询,其中path和_id是mongo文档的两个字段。

我想获得文档中这两个字段相等的结果列表。

我尝试过使用以下查询。但是无法正确检索结果。接收到的空列表并非如此。

List<Metadata> MetadataList= ops.find(new Query(Criteria.where("path").is("_id")), Metadata.class);

如何获得mongo中两个字段值相等的结果。

2 个答案:

答案 0 :(得分:2)

您正在寻找的是MongoDB中的$where运算符。标准查询操作不会将一个字段的值与另一个字段的值进行比较。为此,您需要使用JavaScript评估服务器端,它实际上可以比较两个字段值:

    BasicQuery query = new BasicQuery(
        new BasicDBObject("$where", "return this._id == this.path")
    );

    <Metadata> MetadataList = ops.find(query, Metadata.class);

或者您可以通过$redact提供的 aggregation framework 管道阶段与本机运营商做同样的事情。

非常确定spring mongo中还没有$redact支持,但您可以使用类包装聚合操作来执行此操作:

public class CustomAggregationOperation implements AggregationOperation {
    private DBObject operation;

    public CustomAggregattionOperation (DBObject operation) {
        this.operation = operation;
    }

    @Override
    public DBObject toDBObject(AggregationOperationContext context) {
        return context.getMappedObject(operation);
    }
}

并像这样使用它:

    Aggregation aggregation = newAggregation(
      new CustomAggregationOperation(
        new BasicDBObject(
          "$redact",
          new BasicDBObject("$cond",
            new BasicDBObject()
              .append("if", new BasicDBObject(
                      "$eq", Arrays.asList("$_id", "$path")
              ))
              .append("then", "$$KEEP")
              .append("else", "$$PRUNE")
          )
        )
      )
    );

    AggregationResults<Metadata> results = ops.aggregate(
            (TypedAggregation<Metadata>) aggregation, Metadata.class);

因此,基本的MongoDB查询操作不会将字段值相互比较。要做到这一点,你需要遵循这里的一种方法。

答案 1 :(得分:0)

您可以使用BasicDBObject添加条件。

尝试一下 BasicDBObject query = new BasicDBObject(“path”,new BasicDBObject(“$ eq”,“_ id”); collection.find(查询);

请参阅以下链接以获取更多信息 http://mongodb.github.io/mongo-java-driver/2.13/getting-started/quick-tour/