2016-12-02 37 views
8

Jestem początkującym z mongo i node.js, aw istniejącym projekcie mamy kolekcję ze sklepami z geoloksem. Pojawia się następujący błąd (usunąłem kilka pól)Błąd 16755 - Mongo nie może wyodrębnić kluczy geograficznych

"code" : 16755, 
"errmsg" : "Can't extract geo keys: { _id: ObjectId('566990eea9c7a38740a305a3'), 
id: 50, guid: \"NL7a09b334-7524-102d-a4ef-00163e5faa0c\", version: 0, owner: 118, 
published: 1, loc: [ -9999, -9999 ], logo: \"69db95d0-d58d-40cf-80d3-ac80b8c86af8.png\" } 
can't project geometry into spherical CRS: [ -9999, -9999 ]" 

gdy próbuję $set niektóre wartości na sklep. Widzę, że wartości -9999, -9999 nie są poprawne, ale kiedy próbuję zastąpić to z (w Robomongo) innymi wartościami, pojawia się ten sam błąd. Jak mogę naprawić ten błąd, więc mogę edytować wartości w loc i zrobić $set?

+0

Jak wygląda Twoja operacja aktualizacji? proszę o dołączenie go pod nr – Khang

Odpowiedz

0

Masz rację, że błąd wynika z nieprawidłowych współrzędnych geograficznych w tym dokumencie (patrz 2dsphere indexes).

Zakładając ten jest dokumentem masz:

> db.test.find() 

{ 
    "_id": ObjectId("566990eea9c7a38740a305a3"), 
    "id": 50, 
    "guid": "NL7a09b334-7524-102d-a4ef-00163e5faa0c", 
    "version": 0, 
    "owner": 118, 
    "published": 1, 
    "loc": [ 
    -9999, 
    -9999 
    ], 
    "logo": "69db95d0-d58d-40cf-80d3-ac80b8c86af8.png" 
} 

Najprostszą metodą jest użycie mongo shell do perform an update, za pomocą ObjectId i zrobić $set on the loc field. Na przykład, przez ustawienie pola loc do prawidłowego współrzędnych (np [-73,97, 40,77]):

> db.test.update({"_id": ObjectId("566990eea9c7a38740a305a3")}, {$set:{loc:[-73.97, 40.77]}}) 

Updated 1 existing record(s) in 1ms 
WriteResult({ 
    "nMatched": 1, 
    "nUpserted": 0, 
    "nModified": 1 
}) 

zauważyć, że w powyższym przykładzie, m użyciu pola _id, które muszą być unikalne , aby polecenie aktualizacji zaktualizowało tylko ten dokładny dokument. Po tym, tworzenie indeksu 2dsphere powinno się powieść:

> db.test.createIndex({loc:'2dsphere'}) 

{ 
    "createdCollectionAutomatically": false, 
    "numIndexesBefore": 1, 
    "numIndexesAfter": 2, 
    "ok": 1 
} 
+0

dzięki za odpowiedź, ale gdy uruchomię 'db.shop.update ({_ id: ObjectId ('566990eea9c7a38740a305a3')}, {$ set: {loc: [- 73,97, 40,77]}})' Dostaję ten sam błąd .. – NVO

+0

Użyłeś powłoki 'Mongo'? Przetestowałem to zapytanie w powłoce 'mongo'. Jeśli używasz RoboMongo do wykonania aktualizacji, mogą wystąpić problemy w RoboMongo, które uniemożliwiają wykonanie aktualizacji. –

+0

Ponadto, indeks nie powinien być tworzony z niepoprawnymi wartościami, a także nie powinien zezwalać na wstawianie z niepoprawnymi wartościami (tzn. Taki dokument nie powinien występować, jeśli istnieje indeks '2dsphere' w polu' loc') . Jeśli nadal nie możesz edytować tego dokumentu, najlepiej jest upuścić i ponownie utworzyć indeks '2dsphere'. –