2011-10-27 10 views
6

Lo que intento hacer es agregar un nuevo {campo: valor} para una publicación de blog. Entonces, por ejemplo, si quisiera comenzar a rastrear impresiones en websites.blog_posts.url: 'http://www.example.com/01.html' ¿cómo puedo agregar ese atributo de impresiones para esa publicación de blog?MongoDB, agregue {field: valor} nuevo en documento incrustado existente con notación de puntos de múltiples niveles?

Mi estructura del documento actual:

{ 
email_address: '[email protected]', 
password: 'random_password', 
first_name: 'John', 
last_name: 'Doe', 
user_type: 'WEBMASTER', 
newsletter: 'NO', 
websites: [{ 
    main_title: 'My Blog Website', 
    main_url: 'http://www.example.com', 
     blog_posts: [{ 
      url: 'http://www.example.com/01.html', 
      title:'My first blog post', 
      description: 'My first description.' 
     }, { 
      url: 'http://www.example.com/02.html', 
      title: 'My second blog post', 
      description: 'My second description.' 
     }, { 
      url: 'http://www.example.com/03.html', 
      title: 'My third blog post', 
      description: 'My third description.' 
     }, { 
      url: 'http://www.example.com/04.html', 
      title: 'My fourth blog post', 
      description: 'My fourth description.' 
     }] 
    }] 
} 

Aquí es lo que pensé que trabajar mediante la actualización y haciendo upsert TRUE.

db.my_collection.update ({ 'websites.blog_posts.url': 'http://www.example.com/01.html'}, { '$ set': '{websites.blog_posts. impresiones: 549}}, true)

El error que he recibido es: * no se pueden agregar a la matriz usando el nombre de campo de cadena [blog_posts] *

Tal vez "$ set" es no es correcto para esto o tal vez no puedo hacer referencia a esa profundidad con la notación de puntos? Empecé a usar MongoDB ayer, cualquier ayuda sería genial.

¡Gracias!

Respuesta

5

Lo que intenta hacer no es posible dado su esquema. La notación de puntos puede ser de varios niveles, pero si hay más de un nivel que es una matriz, ya no se puede abordar utilizando el operador posicional '$'.

E.g. que había necesidad de hacer:

db.my_collection.update( 
    {'websites.blog_posts.url': 'http://www.example.com/01.html' }, 
    {'$set': {'websites.$.blog_posts.$.impressions': 549}}, 
    true); 

Pero tener dos operadores de posición en la actualización no es posible ya que MongoDB sólo puede determinar la posición de un elemento en la primera matriz.

Su única opción es rediseñar su esquema para tener una colección dedicada de sitios web de usuarios (que también es mejor por otros motivos en este caso).

+0

Tiene razón, mi problema era mi esquema y mis corchetes incorrectos para almacenar un documento incrustado. En su lugar, estaba usando corchetes para una matriz. Ahora he agregado con éxito nuevos campos de 4 niveles de profundidad usando notación de puntos con el esquema apropiado. – Chris

+0

Impresionante, buena suerte;) –

Cuestiones relacionadas