我在初始化文件中有以下内容,以便在启动时获取数据库中加载的值:
Meteor.startup(function() {
if(typeof Person.findOne() === 'undefined') {
Person.insert({
name: "",
gender: ["male", "female", "prefer not to say"],
age: 0
});
}
});
然后在server / abc.js中我有:
Meteor.methods({
checkPerson: function (input) {
for (var key in Person) {
if (input === key) {
...
}
}
}
});
在客户端调用此流星方法checkPerson,并将字符串值作为唯一参数(输入)传递。
我想检查一下'输入'字符串值与Person Collection中键的名称相对应。
人有一个名为“性别”的密钥。例如,如果'输入'保持字符串值'性别'那么if语句应该是true,但在我的情况下它是假的,因此if语句中的代码永远不会被执行。
任何有关此的帮助/指导将不胜感激。
更新
我搜索了mongodb文档并在此处找到:http://docs.mongodb.org/manual/reference/operator/query/exists/并使用了此主题的一些帮助:(using $exists in Mongo with dynamic key names and the native driver for node) 我可以做这样的事情:
var checkThis = {};
checkThis[input] = { $exists : true };
var p = Person.findOne(checkThis);
所以,如果它找到一个,那么' p'持有记录,否则它将是未定义的。但仍然上面的代码不起作用。
如果我直接说:
var p = Person.find({gender: {$exists: true} });
然后它有效。
所以我需要帮助让代码使用变量'输入'。
答案 0 :(得分:0)
Mongo是一个无模式数据库 - 您可以将任何您喜欢的文档结构插入到集合中,并且数据存储不会抱怨。因此,Person
无法指出哪些字段符合该模式。
人们处理这个问题最常见的方法是使用一个在mongo上提供架构层的包。对于meteor,一个受欢迎的选择是SimpleSchema及其相关的包AutoForm。 SimpleSchema允许您定义允许哪些字段进入集合,AutoForm为您提供一组帮助程序以在UI中强制执行它们。
相反,如果您不想使用套餐,则可以执行以下操作:
<强> person.js 强>
var REQUIRED_FIELDS = {
name: String,
gender: ['male', 'female', 'prefer not to say'],
age: Number
};
Person = new Meteor.Collection('person');
Person.isValid = function(person) {
try {
check(person, REQUIRED_FIELDS);
return true;
} catch (_error) {
return false;
}
};
Meteor.methods({
'person.insert': function(person) {
check(person, REQUIRED_FIELDS);
return Person.insert(person);
}
});
我-template.js 强>
Template.myTemplate.events({
submit: function() {
var person = {
name: $('#name').val(),
gender: $('#gender').val(),
age: parseInt($('#age').val(), 10)
};
if (Person.isValid(person))
Meteor.call('person.insert', person);
else
alert('invalid person');
}
});
我们正在使用meteor的check软件包进行一些基本的字段验证。通过向isValid
集合添加Person
帮助程序,我们可以在不需要方法调用的情况下验证架构。最重要的是,我们可以在插入新文档时重复使用相同的检查。