1

当使用 mini-mongo 将文档插入到集合中时,用户可以传递 _id 字段,并且只要它是字符串或 ObjectID(并且不与现有 id 冲突),就会在文档上设置 _id。这对我来说似乎不明智。我希望服务器始终生成文档的 _id,因此我最终不会得到一个字符串(可能具有不同长度)和 ObjectID 作为 _ids 存在的数据库。

有没有一种简单的方法可以实现这一目标?现在我能想到的最好的方法是在拒绝规则中检查 id(其中 _id 已经由 Meteor 设置或者是用户提供的值),如果它不是我想要的类型/长度,我会改变它,但这也需要检查以避免重复的ID。不太难,但对于像这样基本的东西来说似乎过于复杂。

4

2 回答 2

0

查看我的回复,这是您的答案:

拒绝所有插入。创建一个method,collectionInsert(document)来检查是否_id指定了一个字段。

Meteor.methods({
  collectionInsert: function(document) {
    if (document && document._id) {
      delete document._id;
    }
    // Returns the _id generated
    return collection.insert(document);
  }
});

在今天的流星版本(0.8 和更高版本)中,服务器和客户端_id在这种情况下无论如何都会生成相同的。但是使用这种方法应该保证客户端模拟字段插入,并且服务器生成的版本_id是权威的。

于 2013-08-08T05:42:55.233 回答
0

执行此操作的正确方法可能是在Meteor.method. 您不能在高风险应用程序中信任客户端生成的 ID,因此使用collection#insertwith allow/ denyhooks 是不够的。相反,调用一个方法来执行插入,这将始终创建一个服务器生成的 ID。

您仍然可以在客户端上存根此方法,以补偿延迟,但是当服务器调用返回时,插入的 ID 将被覆盖。

于 2014-06-19T14:32:47.993 回答