I have a problem that I cannot resolve. I have a table in MongoDB, and this is structure:
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 }
});
I need to list all names from the table (shopData.name) and then check if the typed name exists in the database. I tried to do something like the one below, but it doesn't work.
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)
}
Could someone take a look at this and help me out?
CodePudding user response:
Part of the issue here comes from the use of a for...in
loop which treats shopData
as an object and loops over all properties of it. Instead try using a for...of
loop which treats shopData
as an array and loops over all objects in it.
...
for(const i of shopData) {
data = `${i.name}\n`
...
}
See also this question on for...in
vs for...of
and this question on JavaScript loops.
CodePudding user response:
The title of the question does not quite match the description of the question. Given the description, let's assume the typed name is assigned to var typedName
.
Let's also assume that you have bound your shopEconomy
schema to a model that will actually interact with a mongodb collection called shopData
. Then this will iterate all the docs in the 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");
}
It is likely that the OP wants to find duplicate name in the collection, for which this pipeline will work:
db.shopData.aggregate([
{$group: {_id: '$name', N:{$sum:1}} },
{$match: {'N':{$gt:1}}}
]);