user3066027
user3066027

Reputation: 327

MongoDb - cursor option is required after upgrade of mongodb

Since we were forced to upgrade our mongo installation, we're receiving an error during some aggregation function calls:

MongoDB.Driver.MongoCommandException: "Command 'aggregate' failed: The 'cursor' option is required, except for aggregate with the explain argument (response: { "ok" : 0.0, "errmsg" : "The 'cursor' option is required, except for aggregate with the explain argument", "code" : 9, "codeName" : "FailedToParse" })"

        BsonArray arr = BsonSerializer.Deserialize<BsonArray>("[{ \"$match\" : { \"Param1\" : \"VAL\" } }, { \"$unwind\" : \"$Entries\" }, { \"$match\" : { \"PARAM\" : \"VALUE\" } }]");
        var pipeline = arr.Select(x => x.AsBsonDocument).ToList();
        // AggregateArgs aArgs = new AggregateArgs { Pipeline = bsonList };
        var cursor = collection.Aggregate(pipeline).ResultDocuments;

I already figured out, that we have to manually add cursor configuration to the BsonDocument - but we weren't able to figure out, how the query should be configured.

Is there any work around for this exception (without changing drivers)?

Upvotes: 2

Views: 1270

Answers (4)

webster1766
webster1766

Reputation: 1

This is what worked in my situation (mongocshardriver v1.9.0-rc0, mongodb server 4.4.0); OutputMode = AggregateOutputMode.Cursor in the AggregateArgs.

    public IEnumerable<BsonDocument> Run(MongoCollection<Item> items)
    {
      var priceRange = new BsonDocument(
        "$subtract",
        new BsonArray
        {
          "$Price",
          new BsonDocument(
            "$mod",
            new BsonArray{"$Price", 100})
        });

      var grouping = new BsonDocument(
        "$group",
        new BsonDocument
        {
          {"_id", priceRange},
          {"count", new BsonDocument("$sum", 1)}
        });

      var sort = new BsonDocument(
        "$sort",
        new BsonDocument("_id", 1)
        );

      var args = new AggregateArgs
      {
        Pipeline = new[] { grouping, sort },
        OutputMode = AggregateOutputMode.Cursor,
      };

      return items.Aggregate(args);
    }
 

Upvotes: 0

Dĵ ΝιΓΞΗΛψΚ
Dĵ ΝιΓΞΗΛψΚ

Reputation: 5669

give this a shot:

var cursor = collection.Aggregate<BsonDocument>(pipeline);

var results = cursor.ToList(); //just get a list of documents and be done with it

while (cursor.MoveNext()) // or iterate over cursor
{
    foreach (var doc in cursor.Current.ToArray())
    {
        //access your documents here
    }
}

Upvotes: 1

user3066027
user3066027

Reputation: 327

was finally able to fix it, by building the command by myself:

        var cmd = new CommandDocument()
        {
            {"aggregate", "collection_name" },
            {"pipeline",  arr},
            {"cursor", BsonDocument.Parse("{}") }
        };

        var res = db.RunCommand(cmd);

Upvotes: 0

Dmitry
Dmitry

Reputation: 322

You have extra brace in the end of query string

Upvotes: 0

Related Questions