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.
Son las restricciones en el nombre del campo antes de mongo 3.6, ahora puede actualizar mongo server a la versión 3.6 o superior para resolver este problema.
https://docs.mongodb.com/manual/reference/limits/#naming-restrictions
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.