query 16mb mongodb

query - mongodb 16mb limit



Actualización de matriz de múltiples anidados en Mongodb (2)

Finalmente lo entendí ... aunque si alguien puede ver una mejor manera de hacer esto, agrégalo como respuesta.

// create the userlinks collection if it doesn''t exist // also add a tag ''foo'' into it, but only if the tag doesn''t exist db.userlinks.update ( {_id: ''1'', ''tags.tag'': {$nin: [''foo'']}}, {$push: {''tags'': {tag:''foo'', links:[]}}}, {upsert: true} ) // add a link into the ''foo'' tag, but only if the link doesn''t exist db.userlinks.update( {_id: ''1'', ''tags.tag'': ''foo'', ''tags.links.link'': {$nin: [''http://foobar.com'']}}, {$push: {''tags.$.links'': {link: ''http://foobar.com'', date: ''15''} } } )

Tengo un esquema de documento en Mongodb que tiene este aspecto:

{ _id: 1 tags: [{ tag: ''foo'' links: [{ link: ''http:www.google.com'' date: ''123'' }] }] }

Estoy tratando de insertar un enlace en la matriz de "enlaces" que será única para el documento.

Mi primera consulta ...

db.userlinks.update ( {_id: 1, tags: {$nin: [{tag:''foo''}]}}, {$push: {''tags'': {tag:''foo''}}}, {upsert: true} )

Me da esto (crea la etiqueta si no existe)

{ "_id" : 1, "tags" : [ { "tag" : "foo" } ] }

Luego sigo con esta consulta ...

db.userlinks.update ( {_id: 1, tags: {tag: ''foo'', links: {$nin: [{link: ''http://www.google.com''}]}}}, {$push: {tags: {tag: ''foo'', links: {link: ''http://www.google.com'', date: ''123''}}}}, {upsert: true} )

Pero me sale este error: "No se puede aplicar el modificador $ push / $ pushAll a un no-array"

Estoy bastante seguro de que el problema está en el componente ''actualización'' de mi segunda consulta, pero no estoy seguro de cómo solucionarlo. Cualquier ayuda sería apreciada.

EDITAR

Mi primera consulta es ahora ... (gracias a Joe)

db.userlinks.update ( {_id: 1, tags: {$nin: [{tag:''foo''}]}}, {$push: {''tags'': {tag:''foo'', links:[]}}}, {upsert: true} )

Mi segunda consulta es ahora ...

db.userlinks.update ( {_id: 1, ''tags.tag'': ''foo''}, {$push: {''tags.$.links'': {link: ''http://www.google.com'', date: ''123''} } } )

Lo que empuja con éxito el enlace en la matriz de ''enlaces'', sin embargo, también permite duplicados. No puedo permitir enlaces duplicados. $ addToSet tipo de trabajo, sin embargo, si la fecha cambia, entonces todavía inserta un enlace duplicado.

¿Hay alguna forma de verificar la existencia del enlace en la parte de ''consulta'' de mi segunda consulta o, en su lugar, agregar solo ToSet si ciertos campos coinciden?


Tal vez cambie su primera consulta a:

db.userlinks.update ( {_id: 1, tags: {$nin: [{tag:''foo''}]}}, {$push: {''tags'': {tag:''foo'', links:[]}}}, {upsert: true} )

La operación $ push solo debería afectar a los enlaces, no a la etiqueta.

{$push: {''tags.links'': {link: ''http://www.google.com'', date: ''123''} } },