我正在尝试使用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) {
});
但是这段代码崩溃了,我试过的其他类似代码再也没有返回空数组。我的搜索没有错(我试着用copypasta写一个精确的字符串)。
有没有办法做到这一点?
答案 0 :(得分:2)
如果您使用的是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
}
});
答案 1 :(得分:0)
好的,我成功完成了这项工作。 不确定这是最优雅的方式,但至少它是一种方式:
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
}
});