Soy un novato en mongodb e ipython. Tengo un conjunto de datos como el siguiente:

book1 = {
"author" :"A A",
"book" : {
    "series" : "19 A, 19 B, 19 C",
    "year" : "1990, 1991, 1992"
}}


book2 = {
"author" :"B B",
"book" : {
    "series" : "20 A, 20 B, 19 C",
    "year" : "1995, 1995, 1992"
} }
book3 = {
"author" :"C C",
"book" : {
    "series" : "19 A, 19 B, 19 C",
    "year" : "1990, 1991, 1992"
} }

Estos datos se insertaron en mongodb. Quiero dividir la serie y el año, porque la primera columna de la serie se publicó en el año que está en la primera columna del año (tal vez los términos "columna" no sean adecuados para estos datos porque la serie y el año no son una matriz, sino un texto) :

{"_id": {series: 19 A}, "year": "1990"}
{"_id": {series: 19 B}, "year": "1991"}
{"_id": {series: 19 C}, "year": "1992"}
{"_id": {series: 20 A}, "year": "1995"}
{"_id": {series: 20 B}, "year": "1995"}

Quiero que imprima documentos como se muestra arriba. La serie es única.

Lo que he hecho hasta ahora es como el siguiente código. La idea es dividir el texto (serie y año) y luego desenrollarlos. Pero estoy confundido sobre cómo crear la lista como se muestra arriba. Pero este código devuelve un error y no tengo idea de cómo resolverlo.

project = {"$project": {"series_list" : {"$split" : ["book.series", ", "]}, 
{"year_list" : {"$split" : ["book.year", ", "]} }} 
}
unwind = {"$unwind" : "$series_list", "$year_list" }
group = {"$group" : {"_id": {"series": "$series_list"}}, "year":"$year_list"}
cur = db.collection.aggregate([project, unwind, group])
0
dede 12 dic. 2017 a las 04:13

2 respuestas

La mejor respuesta

Puede probar la siguiente agregación en la versión 3.4 de mongo.

La idea es $zip juntos series y años matriz con $map para crear una matriz de documentos con el par clave-valor de serie y año seguido de $unwind & $group para crear una combinación única.

$replaceRoot para promover la identificación al nivel superior

db.collection_name.aggregate([
  {
    "$project": {
      "series_and_year_list": {
        "$map": {
          "input": {
            "$zip": {
              "inputs": [
                {
                  "$split": [
                    "$book.series",
                    ", "
                  ]
                },
                {
                  "$split": [
                    "$book.year",
                    ", "
                  ]
                }
              ]
            }
          },
          "as": "zipped",
          "in": {
            "series": {
              "$arrayElemAt": [
                "$$zipped",
                0
              ]
            },
            "year": {
              "$arrayElemAt": [
                "$$zipped",
                1
              ]
            }
          }
        }
      }
    }
  },
  {
    "$unwind": "$series_and_year_list"
  },
  {
    "$group": {
      "_id": {
        "series": "$series_and_year_list.series",
        "year": "$series_and_year_list.year"
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$_id"
    }
  }
])
1
user2683814 12 dic. 2017 a las 01:51

Puedes probar algo como esto:

book1 = {
"author" :"A A",
"book" : {
    "series" : "19 A, 19 B, 19 C",
    "year" : "1990, 1991, 1992"
}}


book2 = {
"author" :"B B",
"book" : {
    "series" : "20 A, 20 B, 19 C",
    "year" : "1995, 1995, 1992"
} }
book3 = {
"author" :"C C",
"book" : {
    "series" : "19 A, 19 B, 19 C",
    "year" : "1990, 1991, 1992"
} }

book_list=[book1,book2,book3]
for i in book_list:
    series_book = []
    b_list={}

    for key,value in i['book'].items():

        series_book.append([kk.strip() for kk in value.split(',')])

    for i in range(0,len(series_book),2):
        zipped_stuff=list(zip(*series_book[i:i+2]))
        for i in zipped_stuff:
            b_list["year"] = i[1]
            b_list["_id"]={'series': i[0]}


            print(b_list)

Salida:

{'_id': {'series': '19 A'}, 'year': '1990'}
{'_id': {'series': '19 B'}, 'year': '1991'}
{'_id': {'series': '19 C'}, 'year': '1992'}
{'_id': {'series': '20 A'}, 'year': '1995'}
{'_id': {'series': '20 B'}, 'year': '1995'}
{'_id': {'series': '19 C'}, 'year': '1992'}
{'_id': {'series': '19 A'}, 'year': '1990'}
{'_id': {'series': '19 B'}, 'year': '1991'}
{'_id': {'series': '19 C'}, 'year': '1992'}
0
Aaditya Ura 12 dic. 2017 a las 05:58