2016-10-19 1 views
1

Ich habe eine Partie in Aktion Sammlung einzufügen, die wie folgt aussieht:MongoDB finden und insertMany nur, wenn die aufeinander abgestimmte Kombination kehrt nicht truthy

[ 

    { 

    "userId": "57ee65fef5a0c032877725db", 

    "postId": "57f63ce196b01748e4712ed3", 

    "type": "like" 

    }, 

    { 

    "userId": "57ee65fef5a0c032877725db", 

    "postId": "57f7335223a76c0f780a44c5", 

    "type": "dismiss" 

    }, 

    { 

    "userId": "57ee65fef5a0c032877725db", 

    "postId": "57f7335223a76c0f780a44c5", 

    "type": "dislike" 

    } 

] 

Schema von Aktionen Sammlungen wie folgt aussieht:

const ActionSchema = new mongoose.Schema({ 
    userId: mongoose.Schema.Types.ObjectId, 
    postId: mongoose.Schema.Types.ObjectId, 
    type: String 
}, { 
    timestamps: true 
}); 

aber vor dem Einfügen möchte ich sicherstellen, dass diese spezifische "userId" und "postId" innerhalb dieses Arrays keine übereinstimmende Kombination in der action collection von db hat. Da ein Benutzer nur eine einzelne Aktion für einen bestimmten Beitrag ausführen kann, der von anderen Benutzern veröffentlicht wurde.

+0

die postIds bekommen und userIds separat in Arrays aus Batch und suchen mit $ und: [{{in: payload.userIds}, {$ in: payload.postIds}}] und fügen diese Dokumente nicht hinzu, während insertMany verwendet wird. Das ist ein bisschen umständlich und ist fehlerhaft. –

Antwort

1

Haroon Ihre Frage war nicht selbsterklärend, aber was ich von Ihrem Szenario zu verstehen ist, dass Sie einen einzigartigen Satz von postID brauchen UND userId so denke ich, Sie eine Verbindung Index sein müssen Form wie. Lassen Sie mich wissen, ob das Szenario

anySchema.index({field1: 1, field2: 1}, {unique: true}); 

Für Ihren Fall falsch wird es

ActionSchema.index({postId: 1, userId: 1}, {unique: true}); 

sein Es versichern, dass Sie immer einen einzigartigen Satz von postID haben und userId

+0

Danke @abm. Es funktionierte wie eine Magie. –

0

Sie meinen, eine Menge von eindeutigen postId, userId in der angegebenen JSON, keine postId, userId sollte wiederholen?

+0

ja, genau. –

+0

können Sie Ihr Modell so definieren, das verhindert doppelte Einträge im ersten Schritt und spart somit viel Arbeit später ... 'use strict'; var mongoose = verlangen ('mongoose'); var accountTypeSchema = new mongoose.Schema ({ Name: {type: String, Index: {unique: true}}, erstellt: {type: Datum, default: Date.now()}, gelöscht: {type : Nummer, Standard: 0} }); module.exports = mongoose.model ('AccountType', accountTypeSchema); –

+0

Eine kleine Erklärung wäre wirklich hilfreich –

1
'use strict'; 
var mongoose = require('mongoose'); 

var accountTypeSchema = new mongoose.Schema({ 
    name:{type:String, index: { unique: true }}, 
    created: {type: Date, default: Date.now()}, 
    deleted: {type: Number, default: 0} 
}); 

module.exports = mongoose.model('AccountType', accountTypeSchema); 
+1

Hier können Sie sehen, dass "Name" Feld ist einzigartig so wie weise Ihre PostIds können auch eindeutig sein und jedes Mal, wenn Sie einen doppelten Wert eingeben wird es eine Nachricht –

+0

Ich wollte etwas wie eine zusammengesetzte Index, aber trotzdem danke. :) –

Verwandte Themen