【问题标题】:Use find on a model inside a model在模型内的模型上使用 find
【发布时间】:2012-11-22 19:47:29
【问题描述】:

我正在尝试使用 mongoose find 方法在未知对象上查找对象。这是解释得更好的代码。

这是我的模型:

var Screen = new mongoose.Schema({
    id : Number,
    pid : Number,
    uploaded : {type: Date, default: Date.now },
    name : String,
    url : String,
    shorty : String
});

var User = new mongoose.Schema({
  id : Number,
  mail:    { type : String, match : /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/ },
  pass:  String,
  token:  String,
  inscDate: { type: Date, default: Date.now },
  lastConnec:     { type: Date, default: Date.now },
  screens:   [Screen],
  lastIp : String,
  valid : { type: Boolean, default : 0}
});

var UserModel = mongoose.model('users', User);
var ScreenModel = mongoose.model('screens', Screen);

所以问题是我的用户模型包含一个屏幕数组。基本上我想为未知用户搜索精确的屏幕。做这样的事情:

var query = UserModel.find({'screens.shorty' : shorty});
query.exec(function(err, screenR) {

    });

但是这段代码崩溃了,我尝试过的其他类似代码除了空数组外从不返回任何东西。而且我的搜索没有错(我试图复制一个确切的字符串)。

有什么可行的方法吗?

【问题讨论】:

  • 如果您开始接受更多答案,您将获得更多帮助。您应该检查最适合您的目的的答案。
  • 我接受有效的答案。只是大多数时候我收到的答案不是解决方案,我独自发现 - 但我可能忘记了一两个,我会检查

标签: javascript node.js mongodb mongoose


【解决方案1】:

如果您使用的是 MongoDB 2.2+,则可以使用 $ 投影运算符将 screens 过滤到与您的查询选择器匹配的第一个元素。

像这样:

var query = UserModel.findOne({'screens.shorty': shorty}, {'screens.$': 1});
query.exec(function(err, user) {
    if (user) {
        // user.screens[0] contains the first element with the matching shorty field
    }
});

【讨论】:

  • 这看起来很棒。我将尝试根据此修改我的代码。谢谢:)
【解决方案2】:

好的,我设法完成了这项工作。 不确定这是最优雅的方式,但至少它是一种方式:

var query = UserModel.find({'screens.shorty' : shorty}); // That query will get me the correct user, but not the screen
query.exec(function(err, screenR) {
    if (err) throw err;
    if (screenR[0]){ 
        for (var i in screenR[0].screens){ // I loop through all the screens
            if (screenR[0].screens[i].shorty == shorty) {
                // Here I have the correct screen and can do whatever with it.
            }

        }

    } else {
        // If no result
    }
});

【讨论】:

  • 如果您只需要数据库中的一个文档,请使用 findOne 而不是 find
猜你喜欢
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2016-10-06
  • 2011-01-29
  • 1970-01-01
相关资源
最近更新 更多