una separado por palabras node espacios entre eliminar desde cortar convertir comas cero caracteres cadena array node.js mongodb mongodb-query aggregation-framework

node.js - separado - Cómo unir las dos cadenas con y sin espacios incluidos



split javascript array (10)

Dado un documento como este:

{ "text" : "cell phones" }

Podrías usar el $where operador como este:

db.collection.find({ $where: function() { return this.text.replace('' '', '''') == "cellphones" } });

No lo recomendaría necesariamente para grandes colecciones (el rendimiento podría no ser excelente). Sin embargo, incluso con grandes colecciones, se podría obtener un buen rendimiento agregando un filtro adicional en el campo "text" para filtrar todos los documentos que no comienzan con los primeros caracteres correctos:

db.collection.find({ "text": { $regex: "^" + "cellphones".charAt(0) }, // this will use an index on the "text" field if available $where: function() { return this.text.replace('' '', '''') == "cellphones" } });

O quizás incluso esta versión con otro filtro en el bit $where que comprueba las longitudes de cadena para un número reducido de comparaciones de cadena:

db.collection.find({ "text": { $regex: "^" + "cellphones".charAt(0) }, // this will use an index on the "text" field if available $where: function() { return this.text.length >= "cellphones".length // performance shortcut && this.text.replace('' '', '''') == "cellphones" } });

Por ejemplo: En DB tengo el valor de cadena como "cell phones" . Si obtengo el valor de cadena como "cellphones" de la interfaz. ¿Cómo puedo compararlo con la cadena de base de datos y obtener los valores de cadena relacionados en respuesta?


Las respuestas a continuación de esta pregunta son buenas, como usar where y Regex , pero podrían estar en su mejor forma si tiene un pequeño número de documentos de los que tal vez quiera consultar.

Si tiene muchos documentos, le sugiero que: 1. Use un campo adicional como el cellphone sin espacio, si se espera que los valores del campo original sean cortos. 2. Trate de usar motores de búsqueda, como ElasticSearch, o la búsqueda de texto de MongoDB, para encontrar lo que necesita, no solo de cell phone cellphone , sino también de mobile phone smartphone . En realidad, cuando buscas algo en Google, las sugerencias mientras escribes también provienen de algoritmos similares pero más complejos.


Primero puede comenzar eliminando los espacios en ambas cadenas antes de compararlos, por ejemplo:

let a = "cell phone"; let b = "cellphone"; let c = "cell phones" const stripSpaces = s => s.replace(//s/g, ''''); // compare console.log(stripSpaces(a) == stripSpaces(b)); // true console.log(stripSpaces(a) == stripSpaces(c)); // false


Primero puede comenzar eliminando los espacios en ambas cadenas antes de compararlos. Supongo que no sabes cuál tiene espacios antes, así que ejecutarás todos los valores a través de la función stripSpaces , por ejemplo:

let a = "cell phone"; let b = "cellphone"; let c = "cell phones" const stripSpaces = (s) => s.split('' '').join(''''); // compare console.log(stripSpaces(a) == stripSpaces(b)); // true console.log(stripSpaces(a) == stripSpaces(c)); // false


Puede ser que resuelva tu problema

Take Device_Names column contains "cell phone" "mobile phone" "cellphone" "laptop"

1.) Forma normal:

select Device_Name from devices where Device_Name=''cellphone'' ; result: "cellphone" which is third one

2.) Por eliminar espacios:

SELECT Device_Name FROM devices WHERE REPLACE(Device_Name, '' '', '''')=''cellphone'' result: "cell phone" "cellphone" which includes first and third one


Puede utilizar una expresión regular cuando busque su valor, como:

cellphones|cell phones

Collection.find({ someName: { $regex: new RegExp(''cellphones|cell phones'', ''''), }, });


Se puede comparar así:

let val1 = ''cell phones''; let val2 = ''cellphones''; console.log(val1.replace(//s/g, '''') === val2.replace(//s/g, '''')) // true //OR console.log(val1.split('' '').join('''') === val2.split('' '').join('''')) // true


Si necesitas un truco de agregación, puedes probar esto

db.collection.aggregate([ { "$project": { "name": { "$reduce": { "input": { "$split": ["$name", " "] }, "initialValue": "", "in": { "$concat": ["$$value", "$$this"] } } } }}, { "$match": { "name": "cellphones" }} ])

Here está el ejemplo de trabajo.


Simplemente elimine esos espacios de la respuesta que está obteniendo después de la búsqueda, luego pase la respuesta para requerir el campo de entrada. Luego haga coincidir esa cadena con la cadena de entrada o front-end. Si ambas coincidencias cargan el contenido requerido. Supongamos que el nombre de la colección es Categoría. Entonces la consulta de muestra será así.

Category.find().exec((err, categories) => { var details=[] var matchCategory=[] categories.map((category,key)=>{ var obj ={} obj.name = category.name.toLowerCase().replace(//s/g, "") details.push(obj); }) if(details.length > 0){ var detailsLength=details.length details.map((category,key)=>{ if(category.name=="cellphones"){ // match your input string matchCategory.push(category) } detailsLength-- }) if(detailsLength==0){ resolve(matchCategory); } } })

Esto puede ayudarte a llegar.


intente reemplazar primero una cadena vacía de una cadena de consulta y luego compare con el campo como

db.test.find(function() { return this.data(function(elm) { "cell phones".replace(/ /g,"") == elm.name }); });