【问题标题】:Output all documents in mongoose输出猫鼬中的所有文档
【发布时间】:2016-12-17 06:22:54
【问题描述】:

我正在使用 mongoose ODM 并且有一个如下所示的架构:

var banSchema = new Schema({
  userid: { type: String, required: true, unique: true },
  name: String,
  groupid: String,
  reason: String,
  timestamp: Date
});

我想从集合中的所有文档中输出每个用户 ID。我正在使用此查询来获取用户 ID 对象。但是我似乎无法自动获取完整列表。我必须手动输入对象编号,如下所示:

bot.onText(/\/sync/i, function (msg) {
    var fromId = msg.from.id;
    var chatId = msg.chat.id;
    if (fromId == config.sudo) {
        console.log('Sudo Confirmed And Authorized!');
        Ban.find({}, function (err, obj) {
            console.log(obj[0].userid);  // Returns A Single ID
            console.log(obj[1].toObject().userid); // Returns a different ID
            bot.sendMessage(chatId, obj[1].toObject().useridid);
        });
    } else {
        console.log('Someone Is Trying To Act Like Sudo! *sigh*');
        bot.sendMessage(chatId, 'You Are Not A Mod!');
    }
});

然而,这并没有返回我想要的完整的 id 列表。我该如何解决这个问题?

上面的代码是一个电报机器人,它在/sync命令上应该返回一个包含集合中所有ID的消息。

Telegram 机器人 API 限制

由于 API 限制,整个输出应包含在一条消息中。

【问题讨论】:

    标签: arrays node.js mongodb object mongoose


    【解决方案1】:

    在集合中的所有文档中获取特定字段的所有值的最简单方法是使用distinct

    Ban.distinct('userid', function (err, userids) {
        // userids is an array containing all userid values in the collection.
        // string.join into a single string for the message.
        bot.sendMessage(chatId, 'USER IDs\n\n' + userids.join('\n'));
    });
    

    【讨论】:

    • 最简单的解决方案!
    【解决方案2】:
    var query = Ban.find({}).select({
                "userid": 1,
                //Add more column fields here
                "_id": 0  //Ensures _id is not displayed
                });
                var arr = [];
                query.exec(function (err, results) {
                       if (err) throw err;
                       results.forEach(function (result) {
                       arr.push(result.userid);
                       // Add more column fields here;
                       });
                       var fixedJoin =arr.join("\n"); 
                             console.log(fixed);
                       bot.sendMessage(chatId, 'List\n\n' + fixedJoin);
                });
    

    【讨论】:

    • 您的方法会产生如下输出:{ userid: '58258161' } { userid: '135207785' } { userid: '268339963' } { userid: '210152609' } of multiple messages。 (新消息中的每个用户 ID)
    • 由于 API 限制,我想避免多条消息。
    • 你能分享一下预期的输出吗?
    • var query = Ban.find({}).select({ "userid": 1, "_id": 0 }); var arr = []; query.exec(function (err, results) { if (err) throw err; results.forEach(function (result) { arr.push(result.userid); }); console.log(arr); });
    • 这个解决方案也是正确的,它为从 mongoDB 添加更多列提供了更大的灵活性!
    【解决方案3】:

    您可以使用以下语法:

    Ban.find({}, 'userid', function(err, users) {
        users.forEach(function(user) { 
           console.log(user);
           bot.sendMessage(chatId, 'users \n' + user);
        });
    })
    

    【讨论】:

    • 您的方法产生最干净的输出(第一个版本)。但是,它发送多条消息而不是一条消息。 58258161 135207785 268339963 210152609
    • @KimMtunguyaz,一次性发送所有,您可以在运行bot.sendMessagejoin之前将所有用户ID或自己连接;)
    【解决方案4】:

    使用这个语法

            Ban.find({}).
            select('userid').
            exec(function(err, result) {
                //result is array of userid of all document
            });
    

    【讨论】:

    • 您的方法生成如下所示:{_id:57ab3880d6ee31682608850,userid:'58258161'},{_id:57ab38a8d6ee31682608852,userid:'135207785'},{_id:57ab4721f6d9dffc2939968,userid:'268339963' },{ _id: 57ac41d09401cefc1566ebfe, userid: '210152609' }` 一条消息
    • 我更喜欢只有用户 ID 的更清晰的输出。
    猜你喜欢
    • 2017-01-28
    • 2013-10-21
    • 1970-01-01
    • 2016-03-03
    • 2021-05-11
    • 2012-11-07
    • 2017-01-26
    • 2020-08-12
    • 2014-05-29
    相关资源
    最近更新 更多