Meteor - 如何从集合中提取密钥名称?

时间:2015-04-23 06:57:00

标签: meteor

我在初始化文件中有以下内容,以便在启动时获取数据库中加载的值:

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} });

然后它有效。

所以我需要帮助让代码使用变量'输入'。

1 个答案:

答案 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帮助程序,我们可以在不需要方法调用的情况下验证架构。最重要的是,我们可以在插入新文档时重复使用相同的检查。