Almacenar una consulta en Mongo

Este es el caso: una tienda web en la que quiero configurar qué elementos deben aparecer en el sjop en función de un conjunto de parámetros. Quiero que esto sea configurable, porque eso me permite experimentar con diferentes parámetros y también cambiar sus valores fácilmente.

Tengo una colección de productos que quiero consultar en función de múltiples parámetros. Un par de estos se encuentran aquí:

dentro del producto:

"delivery" : {
    "maximum_delivery_days" : 30,
    "average_delivery_days" : 10,
    "source" : 1,
    "filling_rate" : 85,
    "stock" : 0
}

pero también existen otros parámetros.

Un ejemplo de dicha consulta para decidir si incluir o no un producto podría ser:

"$or" : [
        {
            "delivery.stock" : 1
        },
        {
            "$or" : [
                    {
                            "$and" : [
                                    {
                                            "delivery.maximum_delivery_days" : {
                                                    "$lt" : 60
                                            }
                                    },
                                    {
                                            "delivery.filling_rate" : {
                                                    "$gt" : 90
                                            }
                                    }
                            ]
                    },
                    {
                            "$and" : [
                                    {
                                            "delivery.maximum_delivery_days" : {
                                                    "$lt" : 40
                                            }
                                    },
                                    {
                                            "delivery.filling_rate" : {
                                                    "$gt" : 80
                                            }
                                    }
                            ]
                    },
                    {
                            "$and" : [
                                    {
                                            "delivery.delivery_days" : {
                                                    "$lt" : 25
                                            }
                                    },
                                    {
                                            "delivery.filling_rate" : {
                                                    "$gt" : 70
                                            }
                                    }
                            ]
                    }
            ]
        }
]

Ahora para hacer que esto sea configurable, necesito poder manejar la lógica booleana, los parámetros y los valores. Entonces, tuve la idea, ya que dicha consulta en sí misma es JSON, para almacenarla en Mongo y hacer que mi aplicación Java la recupere. Lo siguiente es usarlo en el filtro (por ejemplo, buscar o lo que sea) y trabajar en la selección correspondiente de productos. La ventaja de este enfoque es que realmente puedo analizar los datos y la efectividad de la consulta fuera de mi programa.

Lo almacenaría por su nombre en la base de datos. P.ej.

{ 
    "name": "query1",
    "query": { the thing printed above starting with "$or"... }
}

utilizando:

db.queries.insert({
    "name" : "query1",
    "query": { the thing printed above starting with "$or"... }
})

Lo que resulta en:

2016-03-27T14:43:37.265+0200 E QUERY    Error: field names cannot start with $ [$or]
    at Error (<anonymous>)
    at DBCollection._validateForStorage (src/mongo/shell/collection.js:161:19)
    at DBCollection._validateForStorage (src/mongo/shell/collection.js:165:18)
    at insert (src/mongo/shell/bulk_api.js:646:20)
    at DBCollection.insert (src/mongo/shell/collection.js:243:18)
    at (shell):1:12 at src/mongo/shell/collection.js:161

Pero PUEDO ALMACENARLO usando Robomongo, pero no siempre. Obviamente estoy haciendo algo mal. Pero no tengo idea de lo que es. Si falla, y creo una nueva colección e intento nuevamente, tiene éxito. Cosas raras que van más allá de lo que puedo comprender.

Pero cuando trato de actualizar los valores en la "consulta", no se realizan cambios. Nunca. Ni siquiera a veces. Sin embargo, puedo crear un nuevo objeto y descartar el anterior. Entonces, la solución está ahí.

db.queries.update(
    {"name": "query1"},
    {"$set": { 
            ... update goes here ...
        }
    }
)

haciendo esto resulta en:

WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
                "code" : 52,
                "errmsg" : "The dollar ($) prefixed field '$or' in 'action.$or' is not valid for storage."
        }
})

parece bastante parecido al otro mensaje anterior.

Agujas para decir, no tengo ni idea de lo que está sucediendo aquí, así que espero que algunos de los magos aquí puedan arrojar algo de luz sobre el asunto.

Respuestas a la pregunta(4)

Su respuesta a la pregunta