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 に答える