输出猫鼬中的所有文档
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.sendMessage
,join
之前将所有用户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 的更清晰的输出。以上是关于输出猫鼬中的所有文档的主要内容,如果未能解决你的问题,请参考以下文章