2

我很难找到一种优雅的方式来通过 mongodb 查询结果对我不想要的对象数组进行过滤。

我得到一个对象数组:

var articles = Tips.find().fetch();

而且我有几篇文章已经被选中,应该退回

var selected = [{Object}, {Object}];

我很难相信没有内置功能,例如:

articles.remove(selected);

但是没有,考虑到我们在 Meteor 中使用 MongoDb 的数量,我想有人已经找到了一些很好的辅助函数来执行此操作和其他类似功能

谢谢

4

3 回答 3

2

所以我找到了一个合理的解决方案,但它不完整:

Array.prototype.removeObjWithValue = function(name, value){
    var array = $.map(this, function(v,i){
        return v[name] === value ? null : v;
    });
    this.length = 0; //clear original array
    this.push.apply(this, array); //push all elements except the one we want to delete
}

Array.prototype.removeObj = function(obj){
    var array = $.map(this, function(v,i){
        return v["_id"] === obj["_id"] ? null : v;
    });
    this.length = 0; //clear original array
    this.push.apply(this, array); //push all elements except the one we want to delete
}

我仍然遇到的问题是这不起作用并继续返回 []

Array.prototype.removeObjs = function(objs){
    var array = this;
    console.log(array);
    $.each(objs, function (i,v) {
        array.removeObj(v);
        console.log(array);
    })
    console.log(array);
    this.length = 0; //clear original array
    this.push.apply(this, array); //push all elements except the ones we want to delete
}
于 2013-08-28T05:22:20.113 回答
1

正如您在评论中建议的那样,我相信$nin这就是您想要的(是的,它在流星中可用)。例如:

var selectedIds = _.pluck(selected, _id);
var articles = Tips.find({_id: {$nin: selectedIds}});

如果您在客户端上运行它,这也很好,因为您不必fetch在渲染之前调用。

于 2013-08-28T13:31:59.153 回答
0

使用 underscore.js(默认出现在 Meteor 中),尝试

_.difference(articles, [{Object}, {Object}]);

来源:http ://underscorejs.org/#difference

于 2013-08-28T10:48:06.687 回答