2013-05-07 3 views
0

Структура документа в Монго заключается в следующемОбновление вложенными emdedded список, содержащий BasicDBObject к DBRef в MongoDB используя заводной

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

и другую возможную структуру документа в Монго выглядит следующим образом

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) 

Так выглядит документ проекта в 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 
             } 
          } 
         ] 
        } 
       ] 
      } 
    ] 
} 

сейчас проблема I есть, я хочу изменить все вхождения

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

под

projectStatuses, commercialStatuses, and log 

в

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

Это то, что я пытался до сих пор,

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) 
    } 
} 

выше кода делает то, что мне нужно, но проблема сейчас как сохранить обновленные, запрошенные объекты? Я попытался следующие, но Grails продолжают бросать исключение «cannnot отливать BasicDBObject к DBRef», когда я пытаюсь войти в систему:/

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

Я проверил БД после миграции и нет экземпляра объекта пользователя, Есть только ссылки , но все же получить исключение. Я не очень хорошо разбираюсь в написании сценариев миграции, поэтому, если кто-то может помочь мне в том, как сохранить запрошенные документы (что выглядит как большая карта), это было бы здорово или полезные ссылки на документы с практическими рекомендациями. Заранее спасибо :)

ответ

1

okay Мне наконец-то удалось обновить внедренный список, содержащий базу данных Mongo BasicBDObject, в mongo DBRef Object.

Сначала вы должны установить соединение со следующим кодом. Следующий код подключается к базе данных «test» в порту «27017» (порт по умолчанию) на вашем локальном компьютере.

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

следующий написать запрос, который получает все документы, хранящиеся в Монго, который должен быть обновлен, в моем случае все документы. Следующий код поможет вам это сделать.

//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() 

итерация по результатам и обновить то, что вы хотите обновить

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) 
    } 
} 

и теперь, чтобы сохранить изменения, внесенные в документ.

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

Поскольку вы не можете непосредственно обновить вложенный список в MongoDB, который является ошибка в Монго, и сообщается в Монго, надеюсь, они это исправить в ближайшее время, вы можете обновить родительский вложенных списков, в моем случае это список «результаты», который является родителем вложенных списков

+0

Надеюсь, это поможет кому-то :) – Pazuzu