2013-05-07 4 views
0

La structure du document mongo est la suivanteMise à jour imbriquée liste emdedded contenant BasicDBObject à DBRef dans MongoDB en utilisant groovy

Project(@Entity) 
    |--Deliverables(@Embedded, list inside Project) 
     |--DeliveryTypes(@Embedded, list inside Deliverables) 
      |--DeliveryItems(Plain list inside DeliveryTypes) 
       |--log(Plain list inside DeliveryItems) 

et l'autre structure possible du document mongo se présente comme suit

Project(@Entity) 
    |--Deliverables(@Embedded, list inside Project) 
     |--DeliveryTypes(@Embedded, list inside Deliverables) 
      |--DeliveryItems(Plain list inside DeliveryTypes) 
       |--Tasks(Plain list inside DeliveryItems) 
         |--log(Plain list inside Tasks) 
       |--log(Plain list inside DeliveryItems) 

C'est ainsi que le document de projet ressemble à mongoDB

{ 
"_id" : ObjectId("51827f4fe4b07cc5088149ff"), 
"className" : "Project", 
"name" : "TestProject", 
"description" : "This is a test project", 
"state" : "Open", 
"dateCreated" : ISODate("2013-05-02T14:59:27.069Z"), 
"projectStatuses" : [ 
    { 
     "status" : "On Track", 
     "dateCreated" : ISODate("2013-05-02T14:59:27.071Z"), 
     "user" : { 
        "_id" : "[email protected]", 
        "firstName" : "Test", 
        "lastName" : "User", 
        "enabled" : true, 
        "accountExpired" : false, 
        "accountLocked" : false, 
        "passwordExpired" : false 
       } 
    } 
], 
"commercialStatuses" : [ 
    { 
     "status" : "On Track", 
     "dateCreated" : ISODate("2013-05-02T14:59:27.074Z"), 
     "user" : { 
        "_id" : "[email protected]", 
        "firstName" : "Test", 
        "lastName" : "User", 
        "enabled" : true, 
        "accountExpired" : false, 
        "accountLocked" : false, 
        "passwordExpired" : false 
       } 
    } 
], 
"deliverables" : [ 
    { 
     "embeddedId" : ObjectId("5183702fe4b014bfbe387d37"), 
     "name" : "TestSite 01", 
     "deliveryTypes" : [ 
      { 
       "deliveryItems" : [ 
        { 
         "embeddedId" : ObjectId("5183702fe4b014bf00000003"), 
         "type" : "Plain", 
         "log" : [ 
          { 
           "dateCreated" : ISODate("2013-05-03T08:42:10.592Z"), 
           "oldValue" : "Open", 
           "newValue" : "Closed", 
           "user" : { 
              "_id" : "[email protected]", 
              "firstName" : "Test", 
              "lastName" : "User", 
              "enabled" : true, 
              "accountExpired" : false, 
              "accountLocked" : false, 
              "passwordExpired" : false 
              } 
          }, 
          { 
           "dateCreated" : ISODate("2013-05-03T09:24:30.336Z"), 
           "oldValue" : "Closed", 
           "newValue" : "Open", 
           "user" : { 
              "_id" : "[email protected]", 
              "firstName" : "Test", 
              "lastName" : "User", 
              "enabled" : true, 
              "accountExpired" : false, 
              "accountLocked" : false, 
              "passwordExpired" : false 
             } 
          }, 
          { 
           "dateCreated" : ISODate("2013-05-03T13:33:06.550Z"), 
           "oldValue" : "Open", 
           "newValue" : "Closed", 
           "user" : { 
              "_id" : "[email protected]", 
              "firstName" : "Test", 
              "lastName" : "User", 
              "enabled" : true, 
              "accountExpired" : false, 
              "accountLocked" : false, 
              "passwordExpired" : false 
             } 
          } 
         ] 
        }, 
        { 
         "embeddedId" : ObjectId("5183702fe4b014bf00000004"), 
         "type" : "task", 
         "tasks" : [ 
          { 
           "embeddedId" : ObjectId("518370abe4b014bf00000001"), 
           "name" : "TestSubTask 1", 
           "log" : [ 
            { 
             "dateCreated" : ISODate("2013-05-03T08:09:15.624Z"), 
             "oldValue" : "Open", 
             "newValue" : "Created", 
             "user" : { 
                "_id" : "[email protected]", 
                "firstName" : "Test", 
                "lastName" : "User", 
                "enabled" : true, 
                "accountExpired" : false, 
                "accountLocked" : false, 
                "passwordExpired" : false 
               } 
            } 
           ], 
           "plannedEndDate" : ISODate("2013-05-02T22:00:00Z"), 
           "assignedUser" : "Test person", 
           "description" : "This is a test sub task" 
          } 
         ], 
         "log" : [ 
          { 
           "dateCreated" : ISODate("2013-05-03T08:07:52.725Z"), 
           "oldValue" : "Open", 
           "newValue" : "Closed", 
           "user" : { 
              "_id" : "[email protected]", 
              "firstName" : "Test", 
              "lastName" : "User", 
              "enabled" : true, 
              "accountExpired" : false, 
              "accountLocked" : false, 
              "passwordExpired" : false 
             } 
          } 
         ] 
        } 
       ] 
      } 
    ] 
} 

maintenant le problème I avoir, je veux changer toutes les occurrences de

"user" : { 
      "_id" : "[email protected]", 
      "firstName" : "Test", 
      "lastName" : "User", 
      "enabled" : true, 
      "accountExpired" : false,"accountLocked" : false, 
      "passwordExpired" : false 
     } 

sous

projectStatuses, commercialStatuses, and log 

à

"user" : DBRef("User", "[email protected]") 

C'est ce que je l'ai essayé jusqu'à présent,

Mongo connection = new Mongo("localhost", 27017) 
DB db = connection.getDB('test') 

DBCollection projectCollection = Project.collection 
QueryBuilder projectQuery = new QueryBuilder() 
BasicDBObject projectKeys = new BasicDBObject() 
DBCursor projectCursor = projectCollection.find(projectQuery.get(), projectKeys) 
ArrayList projects = projectCursor.toArray() 

projects.each { project -> 
    project.deliverables.each { deliverable -> 
     deliverable.deliveryTypes.each { deliveryType -> 
     deliveryType.deliveryItems.each { deliveryItem -> 
      deliveryItem.log.each { log -> 
       updateLogUser(log, db) 
      } 
     } 
     } 
    } 
} 

static updateLogUser(def log, DB db) { 
    if (log.user?._id) { 
     log.user = new DBRef(db, "User", log.user?._id) 
    } 
} 

Le code ci-dessus fait ce dont j'ai besoin, mais le problème maintenant Comment sauvegarder les objets mis à jour et interrogés? J'ai essayé ce qui suit, mais Grails continuent à jeter exception « cannnot jeté BasicDBObject à DBRef » lorsque je tente de se connecter:/

projects.each { project -> 
     Project.update(['_id': project._id]) {set "deliverables", project.deliverables} 
    } 

J'ai vérifié la base de données après la migration et il n'y a pas d'exemple d'objet utilisateur, il n'y a que des références , mais toujours l'exception. Je ne suis pas très doué pour écrire des scripts de migration, donc si quelqu'un peut m'aider à enregistrer des documents interrogés (ce qui ressemble à une grande carte), ce serait génial, ou des liens utiles vers des documents pratiques seraient également utiles. Merci d'avance :)

Répondre

1

okay J'ai enfin réussi à mettre à jour la liste incorporée contenant mongo's BasicBDObject à mongo DBRef Object.

Vous devez d'abord établir une connexion avec le code suivant. Le code ci-dessous se connecte à la base de données "test" sur le port "27017" (port par défaut) sur votre machine locale.

Mongo connection = new Mongo("localhost", 27017) 
DB db = connection.getDB('test') 

écrire suivant une requête qui obtient tous les documents stockés dans mongo, qui doit être mis à jour, dans mon cas tous les documents. Le code suivant vous aide à le faire.

//specify which collection you want to query 
DBCollection projectCollection = Project.collection 
//specify the query using the following code, in my case all 
//documents so I leave the query object empty 
QueryBuilder projectQuery = new QueryBuilder() 
//specify what fields of the document should be retrieved, in my case 
//I need all the fields, so I leave it empty 
BasicDBObject projectKeys = new BasicDBObject() 
//initialize a cursor, it is more like an iterator, to the results 
DBCursor projectCursor = projectCollection.find(projectQuery.get(), projectKeys) 
//convert the obtained results to an ArrayList 
ArrayList projects = projectCursor.toArray() 

itérer à travers les résultats et mettre à jour ce que vous voulez mettre à jour

projects.each { project -> 
project.deliverables.each { deliverable -> 
    deliverable.deliveryTypes.each { deliveryType -> 
    deliveryType.deliveryItems.each { deliveryItem -> 
     deliveryItem.log.each { log -> 
      updateLogUser(log.user, db) 
     } 
     } 
    } 
    } 
} 

static updateLogUser(def user, DB db) { 
    try { 
     //user.fetch is to check whether the object is BasicDBObject 
     //or DBRef object. if user object is a BasicDBObject then .fetch() 
     //throws an exception else it gets the referenced object 
     if (user && user.fetch()) { 
      return user 
     } else { 
      return null 
     } 
    } catch (Exception e) { 
     return new DBRef(db, "User", user._id) 
    } 
} 

et maintenant pour enregistrer les modifications que vous avez apportées au document.

projects.each { project -> 
    !project.deliverables ?: 
     Project.update(['_id': project.id]) {set "deliverables", project.deliverables} 
} 

Puisque vous ne pouvez pas mettre à jour directement la liste imbriquée dans MongoDB, qui est bogue dans mongo, et est rapporté à mongo, nous espérons qu'ils fixent bientôt, vous pouvez mettre à jour le parent de listes imbriquées, dans mon cas, il est la liste des "livrables" qui est le parent des listes imbriquées

+0

Espérons que cela aide quelqu'un :) – Pazuzu

Questions connexes