【问题标题】:Meteor - How To Extract Key Name From Collection?Meteor - 如何从集合中提取键名?
【发布时间】:2015-07-01 04:38:28
【问题描述】:

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

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

这个meteor方法checkPerson在客户端被调用,一个字符串值作为它的唯一参数(输入)被传递。

我想根据 Person 集合中的键名检查这个“输入”字符串值。

Person 有一个名为“gender”的键。因此,例如,如果“输入”包含字符串值“性别”,则 if 语句应该为真,但在我的情况下它为假,因此 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} });

然后就可以了。

所以我需要帮助以使代码与变量“输入”一起使用。

【问题讨论】:

  • 那么,你基本上是想验证输入框中输入的路径是Person模式的一部分吗?
  • 嘿@BrianShamblen,感谢您的回复。是的,我想验证输入是 Person 模式的一部分。
  • 我更喜欢通过aldeed:autoform 执行此操作,它使用aldeed:simple-schema 来验证合法输入。如果没有特别的理由避免使用它们,它们可能会简化您的生活。
  • 不应该是var key in Personvar key in Person.findOne({})
  • 嘿@Petr 感谢您检查该行。我现在更新了问题,您能帮忙解决问题吗?

标签: meteor


【解决方案1】:

Mongo 是一个无模式数据库 - 您可以将任何您喜欢的文档结构插入到集合中,并且数据存储不会抱怨。因此Person 将无法指出哪些字段符合该模式。

人们处理这个问题最常见的方法是使用一个包,它在 mongo 之上提供了一个模式层。对于流星,一个流行的选择是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);
  }
});

my-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 集合,我们可以验证模式而无需方法调用。最重要的是,我们可以在插入新文档时重复使用相同的检查。

【讨论】:

  • 嘿@David Weldon,感谢您回答我的问题。在我的例子中,稍后在程序中,我还将动态地将键添加到集合中。我喜欢您使用解决方案的方向,但在我的例子中,这不是我想要实现的目标。我认为找到了一种处理这种情况的方法,我将把它写成问题的更新,也许你可以看看它,因为它需要更正才能工作。我再次感谢大卫为这个问题写了如此详尽而有见地的答案。
  • 也许您可以将架构添加为数据库中的单独集合。每次使用新密钥时,您都可以更新架构。这是一种非常不寻常的方法,但在您的情况下可能有意义。
  • 谢谢@David Weldon 我要试试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 2023-03-02
相关资源
最近更新 更多