Tengo un problema que no puedo resolver. Tengo una tabla en MongoDB, y esta es la estructura:
const shopEconomy = new mongoose.Schema({ guildID: { type: String }, name: { type: String }, value: { type: Number }, description: { type: String }, rolereq: { type: String }, roleadd: { type: String }, roleremove: { type: String }, buyinfo: { type: String } });Necesito enumerar todos los nombres de la tabla (shopData.name) y luego verificar si el nombre escrito existe en la base de datos. Intenté hacer algo como el siguiente, pero no funciona.
const shopData = await shopEconomy.find({ guildID: message.guild.id }); let categories = []; let data = new Object(); for(const i in shopData){ data += `${shopData[i].name}\n` categories.push(data) }¿Alguien podría echarle un vistazo a esto y ayudarme?
Parte del problema aquí proviene del uso de un bucle for...in que trata shopData como un objeto y recorre todas sus propiedades. En su lugar, intente usar un bucle for...of que trate shopData como una matriz y recorra todos los objetos que contiene.
... for(const i of shopData) { data += `${i.name}\n` ... } Consulte también esta pregunta sobre for...in vs for...of y esta pregunta sobre bucles de JavaScript.
El título de la pregunta no coincide exactamente con la descripción de la pregunta. Dada la descripción, supongamos que el nombre escrito se asigna a var typedName .
Supongamos también que ha vinculado su esquema shopEconomy a un modelo que realmente interactuará con una colección mongodb llamada shopData . Entonces esto iterará todos los documentos en shopData :
var found = false; cursor = db.shopData.find(); // get EVERYTHING cursor.forEach(function(doc) { print(doc['name']); if(doc['name'] == typedName) { found = true; } }); if(found) { print(typedName,"was found"); }Es probable que el OP quiera encontrar un nombre duplicado en la colección, para lo cual funcionará esta canalización:
db.shopData.aggregate([ {$group: {_id: '$name', N:{$sum:1}} }, {$match: {'N':{$gt:1}}} ]);