0

我正在研究一种使用聚合器框架查询 mongoDB 的方法。我已经建立了聚合,但我不断收到以下异常:

Pipeline::run(): 无法识别的管道操作 \"$or"

如果我在您将 DBObject 附加或添加到查询时理解正确,它们将被隐式添加为和操作。我现在可能真的很累,但我想不出聚合框架的一两个条件。

以下是我的代码片段:

    DBObject matchCriteriaTransmitter = new BasicDBObject("$match",
            new BasicDBObject("someKey": "someValue").
                    append("someKey": "someValue"));

    DBObject matchCriteriaReceiver = new BasicDBObject("$match",
            new BasicDBObject("someKey": "someValue").
                    append("someKey": "someValue"));

    BasicDBList or = new BasicDBList();
    or.add(matchCriteriaTransmitter);
    or.add(matchCriteriaReceiver);

    DBObject matchCriteria = new BasicDBObject("$or", or);

    DBObject sortCriteria = new BasicDBObject("$sort",
            new BasicDBObject("compoundIndex.scenarioDtg", -1));

    DBObject limitCriteria = new BasicDBObject("$limit", 1);


    DBCollection collection = dao.getCollection();

    AggregationOutput output = collection.aggregate(matchCriteria, sortCriteria, limitCriteria);

非常感谢任何见解!

4

2 回答 2

3

检查您可能使用 $or 作为管道运算符但没有这样的运算符的文档:DOC

相反,您可以构造一个 $match 运算符,其中可以包含 or 子句

在 shell 中是这样的:

db.collection.aggregate({$match:{$or:[{someKey:'someValue'},{someOtherKey:'someOtherValue'}]}})

你必须改变的是在 JAVA 中是这样的:

改变这个:

DBObject matchCriteria = new BasicDBObject("$or", or);

对此:

DBObject orCriteria = new BasicDBObject("$or", or);
DBObject matchCriteria = new BasicDBObject("$match", orCriteria);
于 2013-09-11T11:43:30.617 回答
2

我已经在javascript中完成了这个。我确实用 $match 对象包装了 $or 对象。我想知道你是否需要做类似的事情:

DBObject matchCriteriaTransmitter = new BasicDBObject("someKey": "someValue")
                                        .append("someKey": "someValue");

DBObject matchCriteriaReceiver = new BasicDBObject("someKey": "someValue")
                                     .append("someKey": "someValue");

BasicDBList or = new BasicDBList();
or.add(matchCriteriaTransmitter);
or.add(matchCriteriaReceiver);

DBObject matchCriteria = new BasicDBObject("$match", or);
于 2013-09-11T06:05:09.770 回答