27

我正在尝试在流星应用程序中的基础 mongodb 上创建一个两列唯一索引并且遇到了问题。我在流星文档中找不到任何东西。我已经从 chrome 控制台尝试过。我从 term 开始尝试过,甚至试图将 mongod 指向 .meteor 内的 /db/ 目录。我试过了

Collection.ensureIndex({first_id: 1, another_id: 1}, {unique: true});变化。

我希望能够防止流星应用程序 mongo 集合上的重复条目。

想知道有没有人知道这个?

我回答了我自己的问题,真是个菜鸟。

我想到了。

  1. 启动流星服务器

  2. 打开第二个终端并输入meteor mongo

然后创建您的索引...例如,我为 thumbsup 和 thumbsdown 类型系统的记录做了这些。

db.thumbsup.ensureIndex({item_id: 1, user_id: 1}, {unique: true})
db.thumbsdown.ensureIndex({item_id: 1, user_id: 1}, {unique: true})

现在,只需要找出一个引导安装设置,它会在推送到 prod 而不是手动创建这些设置。

4

4 回答 4

31

Collection._ensureIndex(索引,选项)

在 Meteor 源代码中搜索,我发现了一个与ensureIndex绑定的名为_ensureIndex. 对于单键基本索引,您可以按照packages/accounts-base/accounts_server.js在 Meteor 上强制使用唯一用户名的示例:

Meteor.users._ensureIndex('username', {unique: 1, sparse: 1});

对于多键“复合”索引:

Collection._ensureIndex({first_id:1, another_id:1}, {unique: 1});

前面的代码,当放置在服务器端时,确保设置了索引。

警告

注意 _ensureIndex 实施警告:

稍后我们将实际设计一个索引 API。现在,我们只是通过 Mongo's,但让它同步。

于 2012-11-06T19:45:05.830 回答
15

根据文档“Minimongo 目前没有索引。这很快就会到来。” 查看 Collection 上可用的方法,没有ensureIndex.

您可以运行meteor mongomongo shell 并在服务器端启用索引,但 Collection 对象仍然不知道它们。因此,该应用程序将允许您将多个实例添加到集合缓存中,而在服务器端,其他插入将静默失败(错误被写入输出)。当您进行硬页面刷新时,应用程序将与服务器重新同步

所以你现在最好的选择可能是做类似的事情:

var count = MyCollection.find({first_id: 'foo', another_id: 'bar'}).count()
if (count === 0)
    MyCollection.insert({first_id: 'foo', another_id: 'bar'});

这显然不理想,但工作正常。您还可以在服务器上的 mongodb 中启用索引,因此即使在竞争条件下,您实际上也不会得到重复记录。

于 2012-04-16T03:14:04.370 回答
3

Smartpackage aldeed:collection2支持唯一索引以及模式验证。验证将同时发生在服务器和客户端上(反应性地),因此您可以对客户端上的错误做出反应。

于 2014-11-11T11:32:18.103 回答
1

实际上,为什么不用 Meteor.method 在服务器上使用 upsert 并且您也可以使用 ts 发送跟踪它://仅服务器

Meteor.methods({
 add_only_once = function(id1,id2){
   SomeCollection.update(
     {first_id:id1,another_id:id2},{$set:{ts:Date.now()}},{upsert:True});
 }
});

// 客户

Meteor.call('add_only_once',doc1._id, doc2._id);

// 在服务器上运行的实际代码

if(Meteor.is_server) {
    Meteor.methods({
        register_code: function (key,monitor) {
             Codes.update({key:key},{$set:{ts:Date.now()}},{upsert:true});
        }
     ...
于 2012-06-07T18:13:04.050 回答