MongoDB findAndModify() with aggregation

Benjamin Thompson b.thompson at latera.ru
Sat Mar 21 11:01:25 CET 2020


>> If there is any possiblitly to support the aggregation option then I
>> think this would be very useful as it allows much more complex data
>> processing inside the request.
>
>   Sure.  What API does the module have to use?

Hi Alan

I think the API is the right one. The problem seems to be that the
validity check on the "update" parameter is expecting only a document
(which starts and ends with a curly bracket), when actually it should
accept either a document or array (which starts and ends with square
brackets).

The code which does the checking is on line 414 of rlm_sql_mongo.c:

>>>>SNIP>>>>
if (bson_iter_init_find(&iter, bson, "update")) {
    if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) {
        DEBUG("rlm_sql_mongo: 'update' does not hold a document.");
        goto error;
    }

    bson_iter_document(&iter, &document_len, &document);
    bson_update = bson_new_from_data(document, document_len);

    if (!bson_update) {
        DEBUG("rlm_sql_mongo: Failed parsing 'update'");
        goto error;
    }

    update = true;
}
>>>>>>>>>>>>

As a quick test I changed the code as follows:

>>>>SNIP>>>>
if (bson_iter_init_find(&iter, bson, "update")) {
    if (!(BSON_ITER_HOLDS_DOCUMENT(&iter) || BSON_ITER_HOLDS_ARRAY(&iter))) {
        DEBUG("rlm_sql_mongo: 'update' does not hold a document or array.");
        goto error;
    }

    if (BSON_ITER_HOLDS_DOCUMENT(&iter)) {
        bson_iter_document(&iter, &document_len, &document);
        bson_update = bson_new_from_data(document, document_len);
    }
    else {
        bson_iter_array(&iter, &document_len, &document);
        bson_update = bson_new_from_data(document, document_len);
    }

    if (!bson_update) {
        DEBUG("rlm_sql_mongo: Failed parsing 'update'");
        goto error;
    }

    update = true;
}
>>>>>>>>>>>>

Based the minimal testing which I have done this seems to work.
However I am not an expert in C and I was not sure about where the
paramter "document" comes from as this in theory might want to be
renamed to someting else (as it can either be a document or an array).

-- 
Ben Thompson


More information about the Freeradius-Users mailing list