2016-06-14 6 views
1

Ich habe 1,6 Millionen Dokumente in mongodb wie diese mongodb ersetzen:So finden und einzigartig auf Feldnamen

 { 
     "_id" : ObjectId("57580c3f7e1a1469e772345b"), 
     "https://www.....com/vr/s1812227" : { 
      "suitability" : "children welcome", 
      "details" : { 
       "lookingCount" : 0, 
       "photoUrl" : "https://www.....com/vr/s1812227/....", 
       "partner" : null, 
       ......... 
       } 
       ......... 
      } 
    } 

    { 
     "_id" : ObjectId("57580c3f7e1a1469e772346d"), 
     "https://www.....com/vr/s1812358" : { 
      "suitability" : "children welcome", 
      "details" : { 
       "lookingCount" : 0, 
       "photoUrl" : "https://www.....com/vr/s1812358/....", 
       "partner" : null, 
       ......... 
       } 
       ......... 
      } 
    } 

{ 
     "_id" : ObjectId("57580c3f7e1a1469e772346d"), 
     "https://www.....com/vr/s1812358/unite/125" : { 
      "suitability" : "children welcome", 
      "details" : { 
       "lookingCount" : 0, 
       "photoUrl" : "https://www.....com/vr/s1812358/....", 
       "partner" : null, 
       ......... 
       } 
       ......... 
      } 
    } 

Ich möchte wie folgt aus:

{ 
     "_id" : ObjectId("57580c3f7e1a1469e772345b"), 
     "products" : { 
      "suitability" : "children welcome", 
      "details" : { 
       "lookingCount" : 0, 
       "photoUrl" : "https://www.....com/vr/s1812227/....", 
       "partner" : null, 
       ......... 
       } 
       ......... 
      } 
    } 

Inhalt bearbeiten .... Danke für Ihre Antwort und Ihr Interesse im Voraus.

UPDATE Ich versuche, diesen Code aber maximal 1200 Dokumente an neue Sammlung einfügen. Ich habe 1,5 Millionen Dokumente.

db.sourceColl.find().forEach(function(doc) { 
    for (var k in doc) { 
      if (k.match(/^https.*/)) { 
       db.sourceColl.find({ "_id": doc._id }); 
       db.getSiblingDB('targetdb')['targetColl'].insert({products: doc[k]}); 
      } 
    } 
}); 

Nachdem ich das versuche und 20 Dokumente in neue Sammlung einfügen. Ich bin so verwirrt. wie man neue Sammlung alle Dokumente umbenennt und kopiert. UPDATE2: Ich benutze Robomongo und ich denke es gibt Grenzen in robomongo. Dieser Code funktioniert problemlos in der Mongo Shell. Suchen, ersetzen und kopieren Sie ein neues Dokument.

var bulk = db.sourceColl.initializeOrderedBulkOp(); 
var counter = 0; 
db.sourceColl.find().forEach(function(doc) { 
    for (var k in doc) { 
      if (k.match(/^https.*/)) { 
       print(k) 
       bulk.find({ "_id": doc._id }); 
       db.getSiblingDB('targetDB')['targetColl'].insert({products: doc[k]}); 
       counter++; 
      } 
    } 
    if (counter % 1000 == 0) { 
     bulk.execute(); 
     bulk = db.sourceColl.initializeOrderedBulkOp(); 
    } 

}); 
if (counter % 1000 != 0) 
    bulk.execute(); 
+1

Sie wirklich nicht wollen, dynamisches Feld Namen in Ihrer Sammlung haben. Sie sollten Ihr Schemadesign überdenken. – styvane

+2

@ user3100115 Ich denke, genau das versucht das OP zu beheben. Tabarly, wäre es am besten, wenn Sie Ihren Lösungsversuch zu Ihrer Frage hinzugefügt haben. – JohnnyHK

+0

Vielen Dank für Ihre Kommentare. Ich denke, ich fand die Lösung http://stackoverflow.com/questions/25202418/mongodb-how-to-rename-a-field-using-regex?rq=1 Ich versuche es. Ich werde meine Frage aktualisieren. – tabarly

Antwort

0

Ich denke, es gibt Grenzen in Robomongo. Dieser Code funktioniert gut in der Mongo Shell. Suchen, ersetzen und kopieren Sie neue Sammlung.

var bulk = db.sourceColl.initializeOrderedBulkOp(); 
var counter = 0; 
db.sourceColl.find().forEach(function(doc) { 
    for (var k in doc) { 
      if (k.match(/^https.*/)) { 
       print(k) 
       bulk.find({ "_id": doc._id }); 
       db.getSiblingDB('targetDB')['targetColl'].insert({products: doc[k]}); 
       counter++; 
      } 
    } 
    if (counter % 1000 == 0) { 
     bulk.execute(); 
     bulk = db.sourceColl.initializeOrderedBulkOp(); 
    } 

}); 
if (counter % 1000 != 0) 
    bulk.execute(); 

Ich habe diese Antwort modifizierte https://stackoverflow.com/a/25204168/6446251