【问题标题】:Iterating Over an Array and Returning First Match from MongoDB using Mongoose使用 Mongoose 遍历数组并从 MongoDB 返回第一个匹配项
【发布时间】:2021-06-30 01:18:52
【问题描述】:

我的数据库中有一个Users 的集合,以及对应的唯一ids。我正在编写一个以 id 数组作为参数的函数,例如: ["user_id1", "user_id2", "user_id3", "user_id4"].

我希望我的查询返回第一个且只有第一个匹配项。即使用上面的示例,如果 user_id2user_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 -&gt; 60d9e2e0d092bd33d0ebab3b

标签: mongodb mongoose


【解决方案1】:

试试这个。

使用 promises 和猫鼬 findOne 方法:

 let argumentArr = ["user_id1", "user_id2", "user_id3", "user_id4"];
 let getUser = new Promise(function(resolve, reject) {
   for (let i = 0; i < argumentArr.length; i++) {
     User.findOne({_id:argumentArr[i]}).then(user => {
       if(Object.keys(user).length > 0){
         resolve(user)
       }
     }).catch(err => {reject(err)})
   }
 });

 getUser.then(
  (user) => {console.log(user);},//expected results: user(:object)
  (err) => {console.log(err);}
 );
}

【讨论】:

  • 我认为这段代码有一些语法错误
  • 谢谢。我不得不尝试简化它。我希望这会有所帮助。
猜你喜欢
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
相关资源
最近更新 更多