Search code examples
javascriptmongodbmongoosediscord.jsmongoose-schema

MongoDB print only one value of a collection. JavaScript


I'm having a problem with MongoDB console.logging only one data of a collection. I've already searched like infinite topics about this, but none of them does exactly what I want. I want to get one number data from my mongoose database. (I'm creating a discord.js bot) This is what the database looks like:

_id: 61bb8dc5a23c9a077066abf0
user: "soki#2400"
userId: "466270219132731392"
amount: 16
__v: 0

and I want to console.log() the value of amount.

This is my code now:

console.log(giftsSchema.find({"_id": 0},{"user": msg.author.tag},{"userId": msg.author.id}).amount);

So what I want it to print is:

16

But it prints

undefined

Solution

  • I think you mean to search on two fields user and userId. You should use this:

    giftsSchema.findOne(
        {"user": msg.author.tag, "userId": msg.author.id}, // query
        function (err, user) { 
           console.log(user.amount); 
        });
    

    If you want to use projection so that only the amount field is returned, then supply a second param with the fields you want 1 and don't want 0.

    giftsSchema.findOne(
        {"user": msg.author.tag, "userId": msg.author.id}, // query
        {_id: 0, amount: 1}, // projection
        function (err, user) { 
            console.log(user.amount);
        });
    

    In your example you are providing 3 parameters {"_id": 0}, {"user": msg.author.tag}, and {"userId": msg.author.id}. With find() the first param is the query/filter. So in your code you are querying for all records where _id = 0 and I don't think you want that. The second param is for projection, and you provided an invalid object for that, projection values should only be 1 or 0 like your first param. Third param is for options, and doesn't come into play here.

    You want to query on multiple fields by having them in single object like this { field1 : value1, field2 : value2 }. I also think you only want one result, so you should use findOne() instead so you only get a single object in return and not an array of objects.

    Also, Mongoose is asynchronous. So you should make an async function and await for the result. Or you can provide a callback function as shown in my example. NOTE: I don't handle the err case in my example.