users started publications learn guide findone mongodb meteor schema

mongodb - started - MongoError: el campo de puntos... no es válido para el almacenamiento



publications meteor (3)

Estoy intentando actualizar un documento con un atributo anidado coincidente con la siguiente consulta

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

Esquema:

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

Pero me sale un error

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

No estoy seguro de cómo puedo consultar atributos anidados, si no es a través de la notación de puntos


El error se produce porque MongoDB no puede funcionar cuando hay puntos presentes en la clave. Un error similar,

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

Ocurre cuando el código es:

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

Cuando los datos se cambian a

day = "2016_11_14"

El problema está arreglado.



Usted necesita aplanar su operador $set param:

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

No está mostrando su upsertByCommentThreadId() entrada para esa función upsertByCommentThreadId() , pero sospecho que está enviando el objeto, a juzgar por esa parte de la consulta. Ejemplo, usted tiene:

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

Así que su parte de consulta está bien, pero el $set espera una clave simple: valor, donde clave debe ser una cadena.

Entonces, estás enviando algo como:

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 */} );

Entonces, su operador $set quiere un simple { key: value } , donde key es una cadena.