sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo implemento esta operación de consulta y actualización de mongodb (controlador CSharp)?

Si esencialmente entiendo tu esencia, básicamente quieres

  1. Seleccione el elemento que no se requiere de su matriz de referencias
  2. Establezca el valor de su campo de referencia principal en el primer elemento de la matriz alterada

Y hazlo todo en una sola actualización sin mover documentos a través del cable.

Pero esto lamentablemente no se puede hacer. El principal problema con esto es que no hay forma de referirse al valor de otro campo dentro del documento que se está actualizando. Aun así, para hacer esto sin iterar, también necesitaría acceder al modificado matriz para obtener el nuevo primer elemento.

Tal vez un enfoque sea repensar su esquema para lograr lo que desea. Mi opción aquí sería ampliar un poco sus documentos de referencia y eliminar la necesidad del campo de referencia principal.

Parece que la suposición con la que está dispuesto a vivir en las actualizaciones es que si la referencia eliminada era la referencia principal, entonces puede establecer la nueva referencia principal en el primer elemento de la matriz. Con eso en mente, considere la siguiente estructura:

refs: [ { oid: "object1" }, { oid: "object2" }, { oid: "object5", main: true } ]

Al cambiarlos a documentos con un oid propiedad que se establecería en ObjectId, da la opción de tener una propiedad adicional en el documento que especifica cuál es la predeterminada. Esto se puede consultar fácilmente para determinar qué Id es la referencia principal.

Ahora también considere lo que sucedería si el documento que coincide con "objeto5" en el campo oid fuera extraído de la matriz:

refs: [ { oid: "object1" }, { oid: "object2" } ]

Entonces, cuando consulta cuál es la main-reference según la lógica anterior, acepta el primer documento de la matriz. Ahora, por supuesto, para los requisitos de su aplicación, si desea establecer una main-reference diferente solo modificas el documento

refs: [ { oid: "object1" }, { oid: "object2", main: true } ]

Y ahora la lógica sigue siendo elegir el elemento de la matriz que tiene la propiedad principal, ya que true ocurriría con preferencia, y como se muestra arriba, si esa propiedad no existe en ningún documento de elementos, entonces recurra al primer elemento.

Con todo eso digerido, su operación para extraer todas las referencias a un objeto de esa matriz en todos los documentos se vuelve bastante simple, como se hace en el shell (básicamente, el mismo formato debería aplicarse a cualquier controlador):

db.books.update(
   { "refs.oid": "object5" },
   { $pull: { refs: {oid: "object5"} } }, false, true )

Los dos argumentos adicionales para la operación de consulta y actualización son upsert y multi respectivamente. En este caso, upsert no tiene mucho sentido ya que solo queremos modificar documentos que existen, y multi significa que queremos actualizar todo lo que coincidió. El valor predeterminado es cambiar solo el primer documento.

Naturalmente, acorté toda la notación, pero, por supuesto, los valores pueden ser ObjectId reales según su intención. También parecía razonable suponer que su uso principal de main-reference es una vez que haya recuperado el documento. Definición de una consulta que devuelve la main-reference siguiendo la lógica que se describió debería ser posible, pero tal como está, he escrito mucho aquí y necesito un descanso para cenar :)

Creo que esto presenta un caso que vale la pena para repensar su esquema para evitar iteraciones sobre lo que desea lograr.