Sie brechen eine Regel, wie Sie einen Index im Allgemeinen verwenden können. Es stimmt zwar, dass es einen "2dsphere" -Index gibt, der die "erste" Eigenschaft in einem zusammengesetzten Index ist, aber es ist sehr wichtig, dass Ihre "Abfragen" tatsächlich die erste Eigenschaft adressieren, damit der Index ausgewählt wird .
Dies ist in Prefixes aus dem Handbuch für zusammengesetzte Indizes abgedeckt. In Auszug:
{ "item": 1, "location": 1, "stock": 1 }
The index has the following index prefixes:
- { item: 1 }
- { item: 1, location: 1 }
For a compound index, MongoDB can use the index to support queries on the index prefixes. As such, MongoDB can use the index for queries on the following fields:
- the item field,
- the item field and the location field,
- the item field and the location field and the stock field.
However, MongoDB cannot use the index to support queries that include the following fields since without the item field, none of the listed fields correspond to a prefix index:
- the location field,
- the stock field, or
- the location and stock fields.
Weil Ihre Abfrage "loc"
erste verweist und nicht "category"
enthält, wird der Index nicht erhalten ausgewählt und MongoDB gibt den Fehler. Um den von Ihnen definierten Index zu verwenden, müssen Sie auch "category"
abfragen. Änderung Ihren Eintrag:
var mongoose = require("mongoose");
mongoose.set('debug',true);
var LocationSchema = new mongoose.Schema({
userName: String,
category: Number,
loc: {
'type': { type: String, enum: "Point", default: "Point" },
coordinates: { type: [Number] }
}
})
//LocationSchema.index({ loc: "2dsphere", category: 1 },{ "background": false });
LocationSchema.index({ category: 1, loc: "2dsphere" });
var Location = mongoose.model("location", LocationSchema);
var mongoDB = 'mongodb://localhost/test';
mongoose.Promise = global.Promise;
mongoose.connect(mongoDB, { useMongoClient: true });
var testUser = Location({
userName: "Tester",
category: 1,
loc: { coordinates: [12.44, 55.69] }
});
testUser.save(function (err) {
if (err) {
return console.log("UPPPPs: " + err);
}
console.log("User Saved, Try to find him:");
let query = Location.find({
category: 1,
loc:
{
$near:
{
$geometry:
{
type: "Point",
coordinates: [12.50, 55.71]
},
$maxDistance: 600000
}
}
})
query.exec(function (err, docs) {
if (err) {
return console.log("Err: " + err);
}
console.log("Found: " + JSON.stringify(docs))
})
});
Solange wir "category"
alles enthalten ist in Ordnung:
User Saved, Try to find him:
Mongoose: locations.find({ loc: { '$near': { '$geometry': { type: 'Point', coordinates: [ 12.5, 55.71 ] }, '$maxDistance': 600000 } }, category: 1 }, { fields: {} })
Found: [{"_id":"59f8f87554900a4e555d4e22","userName":"Tester","category":1,"__v":0,"loc":{"coordinates":[12.44,55.69],"type":"Point"}},{"_id":"59f8fabf50fcf54fc3dd01f6","userName":"Tester","category":1,"__v":0,"loc":{"coordinates":[12.44,55.69],"type":"Point"}}]
Der alternative Fall ist, einfach „Präfix“ der Index mit der Lage. ersten Sicherzustellen vorherigen Indizes oder die Sammlung löschen:
LocationSchema.index({ loc: "2dsphere", category: 1 },{ "background": false });
so gut wie Sie wahrscheinlich in der Gewohnheit "background": true
der Einstellung sein sollten, sonst anfangen zu laufen in ihren Rennbedingungen auf Unit-Tests, wo der Index nicht wurde erstellt beendet bevor der Unit-Test-Code versucht, ihn zu verwenden.
Gibt es etwas in der mitgelieferten Antwort, die Sie glaubt nicht, Ihre Frage zu beantworten? Wenn ja, dann kommentieren Sie bitte die Antwort, um zu klären, was genau adressiert werden muss, was nicht der Fall ist. Wenn es tatsächlich die Frage beantwortet, die Sie gestellt haben, dann beachten Sie bitte [Akzeptieren Sie Ihre Antworten] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) zu den Fragen, die Sie stellen fragen Sie –