输出猫鼬中的所有文档

Posted

技术标签:

【中文标题】输出猫鼬中的所有文档【英文标题】: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 限制,整个输出应包含在一条消息中。

【问题讨论】:

【参考方案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 的更清晰的输出。

以上是关于输出猫鼬中的所有文档的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬中的 findOne 子文档

猫鼬中的 findOne 子文档

在猫鼬中仅更改整个嵌入式文档数组的一个字段

在猫鼬中仅更改整个嵌入式文档数组的一个字段

如何更新猫鼬中的多个文档?

如何更新猫鼬中的多个文档?