【问题标题】:How to use embedded document in Meteor如何在 Meteor 中使用嵌入文档
【发布时间】:2016-06-05 20:51:38
【问题描述】:

我是 Meteor 的新手,我想在我的用户集合中使用嵌入文档。我正在使用由 collection2 包添加的简单模式。但是当我定义嵌入文档时,我只是在我的一个 Node.js 项目中定义并且它成功运行而没有任何错误,但是当我在用户集合内的 Meteor 项目中定义相同时,它会引发 错误,即

    /home/parveen/.meteor/packages/meteor-tool/.1.3.2_4.10vjklo++os.linux.x86_64+web.browser+web.cordova/mt-os.linux.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:267
W20160604-23:22:34.819(5.5)? (STDERR)                       throw(ex);
W20160604-23:22:34.819(5.5)? (STDERR)                             ^
W20160604-23:22:34.941(5.5)? (STDERR) Error: Invalid definition for location field.
W20160604-23:22:34.941(5.5)? (STDERR)     at packages/aldeed_simple-schema/simple-schema.js:457:1
W20160604-23:22:34.941(5.5)? (STDERR)     at Function._.each._.forEach (packages/underscore/underscore.js:113:1)
W20160604-23:22:34.941(5.5)? (STDERR)     at [object Object].SimpleSchema (packages/aldeed_simple-schema/simple-schema.js:454:1)
W20160604-23:22:34.941(5.5)? (STDERR)     at meteorInstall.collections.Users.js (collections/Users.js:11:14)
W20160604-23:22:34.942(5.5)? (STDERR)     at fileEvaluate (packages/modules-runtime/.npm/package/node_modules/install/install.js:141:1)
W20160604-23:22:34.942(5.5)? (STDERR)     at require (packages/modules-runtime/.npm/package/node_modules/install/install.js:75:1)
W20160604-23:22:34.942(5.5)? (STDERR)     at /home/parveen/differentialImaging/.meteor/local/build/programs/server/app/app.js:957:1
W20160604-23:22:34.942(5.5)? (STDERR)     at /home/parveen/differentialImaging/.meteor/local/build/programs/server/boot.js:283:10
W20160604-23:22:34.942(5.5)? (STDERR)     at Array.forEach (native)
W20160604-23:22:34.942(5.5)? (STDERR)     at Function._.each._.forEach (/home/parveen/.meteor/packages/meteor-tool/.1.3.2_4.10vjklo++os.linux.x86_64+web.browser+web.cordova/mt-os.linux.x86_64/dev_bundle/server-lib/node_modules/underscore/underscore.js:79:11)
=> Exited with code: 8
=> Your application is crashing. Waiting for file change.

我的架构如下:-

 UserSchema = new SimpleSchema({
name:{
    type: String,
    trim: true,
    optional: true
},
email:{
    type:String,
    trim: true,
    optional: true
},
password:{
    type:String,
    trim: true,
    optional: true
},
location: {
         latitude: {
             type: Number,
             default: 0,
             required: false
         },
         longitude: {
             type: Number,
             default: 0,
             required: false
         },
         state: {
             type: String,
             default: '',
             requried: false,
             trim: true
         },
         city: {
             type: String,
             default: '',
             requried: false,
             trim: true
         }
     },
createdAt:{
    type:Date,
    label:"Created At",
    autoValue:function(){
        return new Date();
    }

}
});
Users.attachSchema(UserSchema);

如您所见,它在我使用嵌入文档的位置字段中给出错误。

请告诉我如何在 Meteor 中实现同样的效果,或者我在这里做错了什么。我是否需要使用其他模式而不是简单模式,或者我们也可以通过简单模式实现相同的目的。

任何帮助建议将不胜感激 谢谢

【问题讨论】:

    标签: javascript node.js mongodb meteor simple-schema


    【解决方案1】:

    要定义嵌入式验证规则,您需要创建一个新的架构对象,并将其作为字段传递(简单架构不会查看您的对象结构):

    LocationSchema = new SimpleSchema({
             latitude: {
                 type: Number,
                 default: 0,
                 required: false
             },
             longitude: {
                 type: Number,
                 default: 0,
                 required: false
             },
             state: {
                 type: String,
                 default: '',
                 requried: false,
                 trim: true
             },
             city: {
                 type: String,
                 default: '',
                 requried: false,
                 trim: true
             }
    });
    
    UserSchema = new SimpleSchema({
        //... other fields
        location: LocationSchema,
        //...
    });
    

    然后在您的代码中,您可以:

    Users.insert({
      //...
      location: {latitude: 4.12, longitude: 6.18, state:"Colorado", city "Whatever"}
      //...
    });
    

    您可以在the collection2 documentation 中查看另一个示例。

    【讨论】:

    • @ Julien 感谢您的快速回复,但如果我将它们定义为与嵌入式文档的优势不同的架构,那么它类似于我们在 MongoDb 中使用的参考,我还需要创建此架构的单独文件。如果我错了,请纠正我,因为这是我第一次与 Meteor 合作,可能是我错了。
    • 不,它不会作为参考存储。它只是一个简单模式在内部用于验证的对象。这就是您为嵌入式文档定义验证的方式。您不需要将它放在另一个文件中,因为它与用户有关。再说一遍:它不会创建一个不同的集合(如 mysql 表),只是一个嵌入字段。
    • 我添加了一个如何插入对象的示例,以防有助于理解。
    • 感谢您的回复,现在我知道如何处理了。如果您也让我知道我们如何使用简单的模式在 Meteor 中存储其他集合的引用而不是嵌入文档,并且在哪种情况下更好,请尽可能提供示例。因为我试图找出何时使用哪种方法更好,但没有找到任何可靠的解决方案。提前致谢
    • 这是一个非常广泛的话题。这是一篇关于使用流星和mongo的关系的文章:meteor.hromnik.com/blog/joins-in-meteorjs-and-mongodb至于何时使用哪个,这取决于您将如何使用您的数据。这是一个关于它的 SO 问题:stackoverflow.com/questions/5373198/…
    猜你喜欢
    • 2016-08-17
    • 1970-01-01
    • 2020-12-20
    • 2011-03-10
    • 2016-04-03
    • 2020-08-25
    • 2012-05-11
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多