Tengo este esquema de modelo Mongoose
const postSchema = new Schema({ title: String, headline: [{ kind: String, id: Schema.Types.ObjectId, content: String, relevance: Number, _id: false }], }); Quiero encontrar modelos en la base de datos donde la matriz de headline tenga una longitud mayor que x
tengo esta consulta:
const query = { 'headline.kind': 'topic', 'headline.id': topicId, 'headline':{ '$size':{ '$gt': x } } };pero cuando uso esto me sale:
{ MongooseError: Cast to number failed for value "{ '$gt': 2 }" at path "headline" at CastError (/home/oleg/WebstormProjects/lectal/api/node_modules/mongoose/lib/error/cast.js:26:11)alguien sabe la forma correcta de construir esta consulta? (En mi código simplemente codifiqué el número 2 para x).
Para la forma más eficiente, puede hacer esto con una "notación de puntos" especificando la posición n . Lo que básicamente significa que si una matriz tiene "al menos" n + 1 elementos, entonces devuélvalo.
Entonces, en lugar de escribir { "$gt": 2 } , busca la presencia del valor de índice del elemento "tercero" (desde el índice cero, el tercero es 2):
{ "headline.2": { "$exists": true } } El operador $exists está buscando la presencia de un elemento en ese índice dado, y cuando se cumple la condición, la matriz debe tener al menos esa longitud y, por lo tanto, "mayor que dos".
También tenga en cuenta que su condición de consulta quiere hacer coincidir varias propiedades en un elemento de matriz, y para esto realmente usa $elemMatch , de lo contrario, las condiciones realmente se aplican para hacer coincidir cualquier elemento en la matriz, y no solo el que tiene "ambas" condiciones como $elemMatch lo hace.
{ "headline": { "$elemMatch": { "kind": "topic", "id": topicId } }, "headline.2": { "$exists": true } }para hacer eso "dinámicamente", simplemente construimos la consulta generando la clave a partir del parámetro:
const query = { "headline": { "$elemMatch": { "kind": "topic", "id": topicId } } }; query['headline.'+x] = { "$exists": true }Por lo que he leído, no es posible hacer eso usando $size y $gt .
Intente usar $where - http://mongoosejs.com/docs/api.html#query_Query-%24where
$expr:{$gte: [{$size: "$preferredArray"}, specifiedsize]}
Si está utilizando agregado, es mejor y más rápido; toda la consulta se vería así:
db.collection.aggregate([ { $match: { preferred criteria:1, $expr:{$gte: [{$size: "$diagnosis"}, 2]} } },