0

タイトルがわかりにくいと思いますが、もっとわかりやすく説明させてください。

私のマングーススキーマは次のようになります。

var LocationSchema = new Schema({
  locationKey: {type: String, unique: true},
  wheat: Array,
  barley: Array,
  cty: {type: String, unique: true},
  twp: {type: String, index: { unique: true} , dropDups: true},
  rge: {type: String, unique: true},
});

このスキーマを使用して 3500 の場所を作成するコードをいくつか書きました。問題は、多くの場所で の値が同じであることですtwp。この場合、オブジェクトを作成する必要がありますが、作成twpされた他のオブジェクトに同じtwp.

上記のように、上記のユニークなアプローチを使用してみました。わかりやすくするために、2 つのサンプル オブジェクトを次に示します。

オブジェクト 1:

{
    "_id" : ObjectId("56f5af9547a341720b0b25cd"),
    "rge" : "034E",
    "twp" : "001N",
    "cty" : "003",
    "locationKey" : "003001N034E",
    "__v" : 0
}

を持つ新しいオブジェクトを作成する場合は、作成しtwp: 001Nたいと思いますが、次のようになります。

{
    "_id" : ObjectId("56f5af9547a341720b0b25cd"),
    "rge" : "034W",
    "cty" : "004",
    "locationKey" : "003001N034E",
    "__v" : 0
}

サーバー JS には 3,000 個のオブジェクトの配列があります。この配列をループして、次のように各アイテムの Location オブジェクトを作成しています。

locations.forEach(function(item){
  var location = new Location();
  location.locationKey = item.locationKey.trim();
  location.cty = item.cty.trim();
  location.twp = item.twp.trim();
  location.rge = item.rge.trim();
  location.wheat = item.wheat;
  location.barley = item.barley;
  location.save();
});
4

1 に答える 1

1

schema.queueスキーマを作成する前にメソッドを追加するには、このディスカッションに従って実行できます。以下のテストコードは次のとおりですmongoose v4.4.6

var twpSet = new Set();

LocationSchema.methods.twp1 = function () {
    var curTwp = this.twp;

    if (twpSet.has(curTwp)) {
        this.twp = undefined; // remove the twp field once duplicated
    } else {
        twpSet.add(curTwp); // save the existing twp value
    }
};

LocationSchema.queue('twp1'); 

テストデータ

var l1 = new Loca({
    locationKey: 'k1',
    cty: 'c1',
    twp: 't1',
    rge: 'r1'
});

console.log(l1);
l1.save(function(err) {
    if (err)
        console.log(err);
    else 
        console.log('save location1 successfully');
})

var l2 = new Loca({
    locationKey: 'k2',
    cty: 'c2',
    twp: 't1',
    rge: 'r2'
});

console.log(l2);
l2.save(function(err) {
    if (err)
        console.log(err);
    else 
        console.log('save location2 successfully');
})    

結果は

{ "_id" : ObjectId("56f5e484a22885dd0362a39a"), "locationKey" : "k1", "cty" : "c1", "twp" : "t1", "rge" : "r1", "barley" : [ ], "wheat" : [ ], "__v" : 0 }
{ "_id" : ObjectId("56f5e484a22885dd0362a39b"), "locationKey" : "k2", "cty" : "c2", "rge" : "r2", "barley" : [ ], "wheat" : [ ], "__v" : 0 }

別のオプションは、ミドルウェアsaveを介して新しいドキュメントの前に既存のドキュメントを確認し、重複が見つかった場合は、新しいドキュメントで削除してから保存することです。.pre('save'twp

LocationSchema.pre('save', function(next) {
    var curTwp = this.twp;
    console.log(curTwp);
    var obj = this;
    Loca.findOne({twp: curTwp}, function(err, loc) {
        if (err)
            next(err);
        else if (loc) {
            // find the duplicate twp before save
            obj.twp = undefined;
            next();
        }else 
            next();
    })

});

var Loca = mongoose.model('Loca', LocationSchema);

テストコード

var l1 = new Loca({
    locationKey: 'k1',
    cty: 'c1',
    twp: 't1',
    rge: 'r1'
});
var l2 = new Loca({
    locationKey: 'k2',
    cty: 'c2',
    twp: 't1',
    rge: 'r2'
});

console.log(l1);
l1.save(function(err) {
    if (err)
        console.log(err);
    else {
        l2.save(function(err) {
            if (err)
                console.log(err);
            else 
                console.log('save location2 successfully');
        })  
    }
})

上記のように結果を保存します。膨大なデータが 1 つずつ保存されていることを確認するには、async.series.

于 2016-03-26T01:27:24.933 に答える