2015-05-03 3 views
17

Ich versuche, mit der folgenden Abfrage ein Dokument mit einem passenden verschachtelt Attribute zu aktualisierenMongoError: Das gepunktete Feld .. ist nicht gültig für die Lagerung

upsertByCommentThreadId: function(commentThread) { 
    return CommentThreads.update({ 
     'youtube.commentThreadId': commentThread.youtube.commentThreadId 
     }, 
     { 
     $set: commentThread 
     }, 
     { 
     upsert: true 
     } 
    ); 
    } 

Schema:

Schema({ 
    youtube: { 
    type: Object 
    }, 
    'youtube.etag': { 
    type: String 
    }, 
    'youtube.commentThreadId': { 
    type: String, 
    index: 1 
    }, 
    ... 

Aber ich ein Fehler

Exception while invoking method ... MongoError: The dotted field 'youtube.commentThreadId' in 'youtube.commentThreadId' is not valid for storage. 

ich bin nicht sicher, wie kann ich sonst noch verschachtelte Attribute abfragen, wenn nicht durch Punktnotation

+0

Hat Ihr commentThread das gesamte Dokument, einschließlich der _id? $ set ersetzt den Wert eines Felds durch einen bestimmten Wert, wenn Sie die gesamte Dokumentprüfung ersetzen möchten. Ersetzen Sie einen Dokumentabschnitt in http://docs.mongodb.org/manual/tutorial/modify-documents/ – bharani

+0

Haben Sie eine gefunden? Um es herum? Das gleiche Problem haben. Es scheint, dass Meteor 1.2 ein [fix] (https://github.com/meteor/meteor/commit/e02bf0fb30ed67e4f45417986a548b04de802e1d) dafür haben wird. – jiku

+0

Oder ersetzen zu ** . ** – user956584

Antwort

2

Sie benötigen $set Operator param abzuflachen:

schema.update({ 
    'youtube.commentThreadId': commentThread.youtube.commentThreadId 
}, 
{ 
    $set: { 
    // Here is my change 
    'youtube.commentThreadId': commentThread.youtube.commentThreadId 
    } 
}, 
{ /* opts */}); 

Sie sind nicht Ihre commentThread (Eingang param für diese upsertByCommentThreadId() Funktion zeigt - aber ich vermute, dass Sie das Objekt senden, um diese Abfrage zu urteilen Teil. Beispiel: Sie haben:

let commentThread = { 
    youtube: { 
    commentThreadId: 12345 
    } 
}; 

So Ihre Abfrage Teil ist in Ordnung, aber die $set erwartet einen einfachen Schlüssel: Wert, in dem Schlüssel ein String sein muss.

Also, Sie senden die so etwas wie:

CommentThreads.update({ 

    // Here it's ok, as it's translated to: 
    // { 'youtube.commentThreadId': 12345 } 
    'youtube.commentThreadId': commentThread.youtube.commentThreadId 
    }, 
    { 

    // but this gets expanded to a deeply nested object, like: 
    // { $set: { youtube: {commentThreadId: 12345}}} 
    $set: commentThread 
    }, 
    {/* opts */} 
); 

So, Ihr $set Betreiber will ein einfaches { key: value }, wo key eine Zeichenfolge ist.

4

Der Fehler tritt auf, weil MongoDB nicht funktionieren kann, wenn Punkte im Schlüssel vorhanden sind. Ein ähnlicher Fehler,

MongoError: The dotted field '2016.11.14' in 'myData.days.2016.11.14' is 
      not valid for storage. 

tritt auf, wenn der Code ist:

day = "2016.11.14" 
myData.days[ day ] = 11 

Wenn die Daten zu

day = "2016_11_14" 

das Problem behoben ist geändert wird.

+0

danke für die Bearbeitung – Gerd

Verwandte Themen