L’application d’un index 2dsphere sur un schéma mongoose oblige-t-elle le champ de localisation à être obligatoire?

J’ai un schéma et un modèle de mongoose définis comme suit:

var mongoose = require('mongoose') , Schema = new mongoose.Schema({ email: { index: { sparse: true, unique: true }, lowercase: true, required: true, sortingm: true, type: Ssortingng }, location: { index: '2dsphere', type: [Number] } }) , User = module.exports = mongoose.model('User', Schema); 

Si je tente:

 var user = new User({ email: '[email protected]' }); user.save(function(err) { if (err) return done(err); should.not.exist(err); done(); }); 

Je reçois le message d’erreur:

 MongoError: Can't extract geo keys from object, malformed geometry?:{} 

Bien que le champ de localisation de ce schéma ne soit pas obligatoire, il semble agir de toute façon comme tel. J’ai essayé d’append default: [0,0] qui contourne cette erreur, mais cela ressemble à un bidouillage, car ce n’est clairement pas un bon défaut, et idéalement, le schéma n’exigerait pas que l’utilisateur ait un emplacement à chaque fois.

Les index géospatiaux avec MongoDB / mongoose impliquent-ils que le champ en cours d’indexation est requirejs?

Par défaut, une propriété déclarée qu’un tableau reçoit un tableau vide par défaut à utiliser. MongoDB a commencé à valider les champs geojson et à crier au sujet des tableaux vides. La solution consiste à append un crochet de pré-enregistrement au schéma qui vérifie ce scénario et corrige le document en premier.

 schema.pre('save', function (next) { if (this.isNew && Array.isArray(this.location) && 0 === this.location.length) { this.location = undefined; } next(); }) 

Pour Mangoose 3.8.12, vous définissez la valeur par défaut:

 var UserSchema = new Schema({ location: { 'type': {type: Ssortingng, enum: "Point", default: "Point"}, coordinates: { type: [Number], default: [0,0]} }, }); UserSchema.index({location: '2dsphere'}); 

La seule façon pour moi de résoudre ce problème a été de changer le type d’index de

 GEO:{ type: [Number], index: '2dsphere' } 

à

 GEO:{ type: [Number], index: '2d' } 

C’était un cauchemar