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 :)
Espérons que cela aide quelqu'un :) – Pazuzu