通过_ids数组从集合中删除mongodb文档

时间:2015-12-08 14:19:35

标签: javascript mongodb meteor

使用Meteor,我有一个联系人集合,我列出了每个联系人旁边的复选框。

我希望能够选择多个复选框,然后单击按钮从“联系人”集合中删除所选联系人。

使用下面的代码,所选的_ids显示在控制台的数组中,但没有删除任何内容,也没有生成错误。

contacts.html

<template name="contacts">
    <h1>Contacts</h1>
    <ul>
      {{#each contacts}}
        {{> contact}}
      {{/each}}
    </ul>
    <br/>
    <a href="{{pathFor route='create_contact'}}">Create Contact</a>
    <a class="delete-selected" href="">Delete Selected Contacts</a>
</template>

contact.html

<template name="contact">
  <li style="list-style:none;">
    <input id="{{_id}}" type="checkbox" value="{{_id}}" name="contact"/>
    <a href="{{pathFor 'contact.show'}}"><span class="contact">{{firstName}} {{lastName}} <strong>{{company}}</strong></span></a> {{#if contactType}}({{contactType}}){{/if}}
  </li>
</template>

客户端JS

Template.contacts.events = {
  'click .delete-selected': function(e) {
  e.preventDefault();

  var selectedContacts = [];
  $('input[name=contact]:checked').each(function() {
    selectedContacts.push($(this).val());
  });
  Meteor.call('removeSelectedContacts', {selectedContacts: selectedContacts});
}

服务器JS

Meteor.methods({
    removeSelectedContacts: function(selectedContacts) {
        Contacts.remove({_id:{$in:[selectedContacts]}})
        //Contacts.remove({selectedContacts});
        console.log(selectedContacts);
    }
});

由于

2 个答案:

答案 0 :(得分:1)

@corvid:我认为你只能在客户端上删除一个(_id

@serks:你有一个额外的数组级别,在你的方法中只做:

Contacts.remove({ _id: { $in: selectedContacts }});

您如何调用方法时出现错误,而不是:

Meteor.call('removeSelectedContacts', {selectedContacts: selectedContacts});

直接传递参数:

Meteor.call('removeSelectedContacts',selectedContacts);

该方法需要一个数组,而不是一个对象。

答案 1 :(得分:0)

使用$in运算符。

Template.contacts.events({
  'submit #delete-contacts-form': function (e, template) {
    // assumes permissions are set on server appropriately.
    Contacts.remove({
      _id: {
        $in: $(e.target).find('input:checked').map(el => el.val())  // assumes the value of each checkbox is the _id
      }
    });
  }
});