【发布时间】:2021-06-30 01:18:52
【问题描述】:
我的数据库中有一个Users 的集合,以及对应的唯一ids。我正在编写一个以 id 数组作为参数的函数,例如:
["user_id1", "user_id2", "user_id3", "user_id4"].
我希望我的查询返回第一个且只有第一个匹配项。即使用上面的示例,如果 user_id2 和 user_id4 是数据库中仅有的两个匹配用户,我的结果将只返回 user_id2。不在数据库中的用户 ID 将被忽略。
我目前的方法是使用while循环,但我想看看Mongoose是否提供了更好的解决方案。
当前伪代码:
function findOneUser(userIdArr) {
let user = 0;
let returnedUser;
while(!returnedUser || user < userIdArr.length) {
let id = userIdArr[user];
user = await User.findByID(id);
user++;
}
}
【问题讨论】:
-
您需要使用MongoDB $in 查询并在结果光标上应用
limit()以获得第一个匹配项。 -
@prasad_ 我使用
const foundUser = await User.find({ "_id": { $in : userIds }}).limit(1);设置了这个但是,这是返回最后一个匹配的用户而不是第一个?如果找到匹配项,我想停止查询。我也试过const foundUser = await User.find().where('_id').in(userIds).limit(1); -
mongoose
findOne就是这样做的。findOne({_id: {$in:[...]}}) -
@ISAE 也测试了您编辑的查询,同样的,返回最后一个索引项...
async function pullFirstUser(userIds) { const foundUser = await User.findOne({_id: { $in: userIds }}) return foundUser; } let userIdArr = ["60d9e2e0d092bd33d0ebab4b","60d9e2e0d092bd33d0ebab47", "60d9e2e0d092bd33d0ebab3b"] pullFirstUser(userIdArr);result -> 60d9e2e0d092bd33d0ebab3b