2016-03-26 10 views
0

タイトルが混乱しているとわかりますが、より明確に説明してください。私はこのスキーマを使用して3500点の場所を作成するいくつかのコードを書いたMongooseはオブジェクトを作成する必要がありますが、別のオブジェクトにすでにこのプロパティがある場合はプロパティをスキップします。

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}, 
}); 

:ここ

は私のマングースのスキーマは次のようになります。問題は、多くの場所がtwpの同じ値を持つことです。この場合、まだオブジェクトを作成する必要がありますが、作成された他のオブジェクトに同じtwpがある場合はtwpを作成しません。

上記のように私は上記のユニークな方法を試してみました。ここでは、2つのサンプルオブジェクトは、より明確にするためである。

オブジェクトの一つ:私はtwp: 001Nを持つ新しいオブジェクトを作成するつもりならば

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

、私はそれが作成されるのが好きだろうが、そう見えるように:

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(); 
}); 

私は3000個のオブジェクトの配列を持っているサーバーのJSで
{ 
    "_id" : ObjectId("56f5af9547a341720b0b25cd"), 
    "rge" : "034W", 
    "cty" : "004", 
    "locationKey" : "003001N034E", 
    "__v" : 0 
} 

、私はそうのように各項目の場所のオブジェクトを作成するには、この配列をループしています

答えて

1

は、ここに結果がある

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'); 
})  

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'); 

テストデータ

の下でテストコードがあり、この discussionごと schema.queueを通じて、あなたがそれを行うことができ、スキーマを作成する前のメソッドを追加するには

{ "_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 } 

もう1つの方法は、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'); 
     }) 
    } 
}) 

保存結果

は、あなたが async.seriesを使用することができ、あなたの膨大なデータを1つずつ保存されていることを確認します。

+0

私はこのコードを自分のスキーマに追加し、データベースを落として再構築しました。重複はまだそこにあります。私は何かを見逃していましたか、新しい場所を作成するときにこのメソッドを呼び出す必要がありますか? (mongoose 4.2.2を使用すると問題はないと信じています) – fresh5447

+0

@ fresh5447、私は自分のコードをテストして、うまくいきます。あなたの位置作成コードを要点などで共有してください。 – zangw

+0

@ fresh5447、私はあなたのための別のオプションで私の答えを更新しました。それを試してみてください... – zangw

関連する問題