【问题标题】:searching an array of values against mongoose针对 mongoose 搜索一组值
【发布时间】:2016-06-13 12:20:52
【问题描述】:

我不确定我需要如何做我想做的事。我的架构是这样的:

    var userObj = mongoose.Schema({
  'timestamp':{type: Date, default: Date.now()},
  'password':{type:String, required:true},
  "userName":{type:String, required:true, unique:true}
});

  var groupSchema = mongoose.Schema({
    'creator':String,
    'members':Array,  //contains the _id of users added to the group
    'admins':Array,
    'name':String,
    'timestamp':{type: Date, default: Date.now()},
    'description':String
  });

其中成员架构有一个包含用户 ID 的数组。我需要从组文档中取出数组并取回用户名。

我从使用 mongoose .find() 方法的循环开始,并将结果推送到一个数组中 - 但正如我预期的那样,该数组在回调函数的范围之外是空的。

        var dat = [];
    for(var i = 0; i<passed.payload.length;i++){
      user.find({'_id':passed.payload[i]},'userName',function(err,result){
        if(err){
          console.log(err);
        }else{
          dat.push(result);
        }
      })

    }
    //res.send(dat)

    console.log(dat);

我不确定如何执行此操作 - 我考虑使用 .find 提取所有用户 ID,然后运行数组以仅返回匹配项。拉取完整的用户表然后对其进行测试似乎是一种资源浪费。

是否有更复杂的查询可以与 mongoose 一起使用,以使用 _id 数组进行匹配来提取这样的数据?

【问题讨论】:

    标签: node.js express mongoose


    【解决方案1】:

    您是否考虑过使用$in 运算符?

    db.users.find( { userName: { $in: ["Paul", "Jenna" ] } } )

    这应该更有效,并且也消除了循环。

    这里是 MongoDB 文档的链接 https://docs.mongodb.com/manual/reference/operator/query/in/#op._S_in

    【讨论】:

    • 是的,做到了。我几乎觉得自己很笨,除了我正在学习,所以很好学,我看了看但误解了它的用法。谢谢!
    【解决方案2】:

    您在 for 循环之外得到一个空数组的原因是 mongoose 查询是异步的(在您的情况下为 User.find()),因此 for 循环将在 mongoose 查询完成之前完成,从而导致您得到空数组。您可以使用 Promise 或诸如 async 之类的一些 npm 模块来处理这个问题。

    但是,正如@karlkurzer 建议的那样,您不需要在此处循环遍历数组,您可以改用$in operator。上面的代码可以替换为,

      user.find({'_id': {$in: passed.payload}},'userName',function(err,results){
        if(err){
          console.log(err);
        }else{
          console.log(results); //You will get array of user names here
        }
      });
    

    你应该得到一个与你在回调中传递的 id 相关联的用户名数组。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2017-05-21
      • 1970-01-01
      • 2015-07-23
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2019-01-27
      相关资源
      最近更新 更多