arrays - objects - mongodb select fields
MongoDB: ¿Consulta y recupera objetos dentro de una matriz incrustada? (3)
Hay un par de cosas a tener en cuenta sobre esto:
1) Encuentro que lo más difícil para la gente que aprende MongoDB es que la ONU esté aprendiendo el pensamiento relacional al que están acostumbrados. Su modelo de datos parece ser el correcto.
2) Normalmente, lo que hace con MongoDB es devolver todo el documento al programa cliente, y luego buscar la parte del documento que desea en el lado del cliente usando su lenguaje de programación cliente.
En su ejemplo, obtendría todo el documento de ''usuario'' y luego iteraría a través de la matriz ''items []'' en el lado del cliente.
3) Si desea devolver solo la matriz ''elementos []'', puede hacerlo utilizando la sintaxis ''Selección de campo''. Consulte http://www.mongodb.org/display/DOCS/Querying#Querying-FieldSelection para obtener más información. Desafortunadamente, devolverá el conjunto completo de ''elementos []'', y no solo un elemento del conjunto.
4) Hay un ticket de Jira existente para agregar esta funcionalidad: es https://jira.mongodb.org/browse/SERVER-828 SERVER-828. Parece que se ha agregado a la última rama 2.1 (desarrollo): eso significa que estará disponible para uso de producción cuando se lance la versión 2.2.
Digamos que tengo el siguiente esquema de documento en una colección llamada ''usuarios'':
{
name: ''John'',
items: [ {}, {}, {}, ... ]
}
La matriz ''elementos'' contiene objetos en el siguiente formato:
{
item_id: "1234",
name: "some item"
}
Cada usuario puede tener varios elementos incrustados en la matriz ''elementos''.
Ahora, quiero poder recuperar un artículo por un item_id para un usuario determinado.
Por ejemplo, quiero obtener el elemento con el ID "1234" que pertenece al usuario con el nombre "John".
¿Puedo hacer esto con mongoDB? Me gustaría utilizar su potente indexación de matriz, pero no estoy seguro de si puede ejecutar consultas en matrices incrustadas y devolver objetos de la matriz en lugar del documento que la contiene.
Sé que puedo buscar usuarios que tengan un determinado elemento utilizando {users.items.item_id: "1234"}. Pero quiero recuperar el elemento real de la matriz, no el usuario.
Alternativamente, ¿hay tal vez una mejor manera de organizar estos datos para que pueda obtener fácilmente lo que quiero? Todavía soy bastante nuevo para mongodb.
Gracias por cualquier ayuda o consejo que pueda proporcionar.
La pregunta es antigua, pero la respuesta ha cambiado desde entonces. Con MongoDB> = 2.2, puedes hacer:
db.users.find( { name: "John"}, { items: { $elemMatch: { item_id: "1234" } } })
Usted tendrá :
{
name: "John",
items:
[
{
item_id: "1234",
name: "some item"
}
]
}
Si esta es una matriz incrustada, entonces no puede recuperar sus elementos directamente. El documento recuperado tendrá la forma de un usuario (documento raíz), aunque no todos los campos se pueden rellenar (según su consulta).
Si desea recuperar solo ese elemento, entonces debe almacenarlo como un documento separado en una colección separada. Tendrá un campo adicional, user_id
(puede ser parte de _id
). Entonces es trivial hacer lo que quieres.
Un documento de ejemplo podría verse así:
{
_id: {user_id: ObjectId, item_id: "1234"},
name: "some item"
}
Tenga en cuenta que esta estructura garantiza la unicidad de item_id
por usuario (no estoy seguro de que desee esto o no).