2017-09-14 4 views
0

J'ai deux collections avec la structure du document suivant: commentaire Collection:Comment fusionner les collections pour obtenir le même schéma de document?

{ 
    "_id" : ObjectId("59bab6c6d41dce6422af08cd"), 
    "userId" : 12345.0, 
    "comment" : "Hey, what's up?", 
    "created" : ISODate("2017-09-14T17:05:10.820+0000") 
} 
{ 
    "_id" : ObjectId("59bab6c6d41dce6422af08ce"), 
    "userId" : 123456.0, 
    "comment" : "Not much", 
    "created" : ISODate("2017-09-14T17:05:10.855+0000") 
} 
{ 
    "_id" : ObjectId("59bab6c6d41dce6422af08cf"), 
    "userId" : 12345678.0, 
    "comment" : "Cool", 
    "created" : ISODate("2017-09-14T17:05:10.889+0000") 
} 
{ 
    "_id" : ObjectId("59bab6c6d41dce6422af08d0"), 
    "userId" : 12.0, 
    "comment" : "Nothing", 
    "created" : ISODate("2017-09-14T17:05:10.931+0000") 
} 

utilisateurs collection:

{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d1"), 
    "unique_Id" : 12345.0, 
    "firstName" : "Rich", 
    "lastName" : "S", 
    "gender" : "M", 
    "country" : "CA", 
    "age" : "18" 
} 
{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d2"), 
    "unique_Id" : 123456.0, 
    "firstName" : "Rob", 
    "lastName" : "M", 
    "gender" : "M", 
    "country" : "US", 
    "age" : "25" 
} 
{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d3"), 
    "unique_Id" : 12345.0, 
    "firstName" : "Sarah", 
    "lastName" : "T", 
    "gender" : "F", 
    "country" : "US", 
    "age" : "13" 
} 

J'ai essayé de les rejoindre et les ont besoin de suivre le même schéma de document après joindre. Je l'ai fait

db.getCollection('users').aggregate([ 
    { 
     $lookup: { 
      from: "comments", 
      localField: "unique_Id", 
      foreignField: "userId", 
      as: "goldStandard" 
     } 

    }, 
    { $out : "test2"} 
]) 

sortie:

{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d1"), 
    "unique_Id" : 12345.0, 
    "firstName" : "Rich", 
    "lastName" : "S", 
    "gender" : "M", 
    "country" : "CA", 
    "age" : "18", 
    "goldStandard" : [ 
     { 
      "_id" : ObjectId("59bab6c6d41dce6422af08cd"), 
      "userId" : 12345.0, 
      "comment" : "Hey, what's up?", 
      "created" : ISODate("2017-09-14T17:05:10.820+0000") 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d2"), 
    "unique_Id" : 123456.0, 
    "firstName" : "Rob", 
    "lastName" : "M", 
    "gender" : "M", 
    "country" : "US", 
    "age" : "25", 
    "goldStandard" : [ 
     { 
      "_id" : ObjectId("59bab6c6d41dce6422af08ce"), 
      "userId" : 123456.0, 
      "comment" : "Not much", 
      "created" : ISODate("2017-09-14T17:05:10.855+0000") 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d3"), 
    "unique_Id" : 12345.0, 
    "firstName" : "Sarah", 
    "lastName" : "T", 
    "gender" : "F", 
    "country" : "US", 
    "age" : "13", 
    "goldStandard" : [ 
     { 
      "_id" : ObjectId("59bab6c6d41dce6422af08cd"), 
      "userId" : 12345.0, 
      "comment" : "Hey, what's up?", 
      "created" : ISODate("2017-09-14T17:05:10.820+0000") 
     } 
    ] 
} 

Maintenant, le "de" documents de recouvrement sont ajoutés sous forme d'objets sous le nom de champ "comme" de type tableau. Si j'utilise $ unwind pour dérouler le tableau, alors il est donné en tant qu'objet. Je ne veux pas être comme un objet, je veux que les documents finaux aient la structure suivante après la jointure: Le champ avec les conditions correspondantes dans $ lookup & les colonnes communes doivent être combinées ensemble pour éviter les champs dupliqués. Les nouveaux champs seront ajoutés aux nouveaux documents. Par exemple:

{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d1"), 
    "unique_Id" : 12345.0, 
    "firstName" : "Rich", 
    "lastName" : "S", 
    "gender" : "M", 
    "country" : "CA", 
    "age" : "18", 
    "comment" : "Hey, what's up?", 
    "created" : ISODate("2017-09-14T17:05:10.820+0000") 
} 
{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d2"), 
    "unique_Id" : 123456.0, 
    "firstName" : "Rob", 
    "lastName" : "M", 
    "gender" : "M", 
    "country" : "US", 
    "age" : "25", 
    "comment" : "Not much", 
    "created" : ISODate("2017-09-14T17:05:10.855+0000") 
} 
{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d3"), 
    "unique_Id" : 12345.0, 
    "firstName" : "Sarah", 
    "lastName" : "T", 
    "gender" : "F", 
    "country" : "US", 
    "age" : "13", 
    "comment" : "Hey, what's up?", 
    "created" : ISODate("2017-09-14T17:05:10.820+0000") 
} 

Veuillez suggérer.

+0

Il est possible en utilisant l'opérateur d'agrégation [$ mergeObject] (https://docs.mongodb.com/master/reference/operator/aggregation/mergeObjects/#definition) dans la version 3.5 de développement qui sera la prochaine version 3.6. Ne sachez pas si c'est une option pour vous. – Veeram

Répondre

1

Vous pouvez utiliser l'opérateur $mergeObject qui sera dans la prochaine version 3.6.

$mergeObject pour fusionner les champs avec les champs de collecte joints suivis de $replaceRoot pour promouvoir le document combiné au niveau supérieur. Avec l'exclusion pour supprimer le champ goldStandard et $out pour écrire dans la nouvelle collection.

Quelque chose comme

db.getCollection('users').aggregate([ 
    { 
    "$lookup": { 
     "from": "comments", 
     "localField": "unique_Id", 
     "foreignField": "userId", 
     "as": "goldStandard" 
    } 
    }, 
    { 
    "$replaceRoot": { 
     "newRoot": { 
     "$mergeObjects": [ 
      "$$ROOT", 
      { 
      "$arrayElemAt": [ 
       "$goldStandard", 
       0 
      ] 
      } 
     ] 
     } 
    } 
    }, 
    { 
    "$project": { 
     "goldStandard": 0 
    } 
    }, 
    { 
    "$out": "test2" 
    } 
]) 
+0

Je vérifie la mise en œuvre de celui-ci, mais comment utiliser cette fonctionnalité future maintenant? J'ai la version 3.4.6 dans laquelle $ mergeObjects en cours d'exécution donne l'erreur suivante: Expression non reconnue '$ mergeObjects' ' – Anubhav

+0

Son disponible dans la série 3.5 dev que vous pouvez télécharger à partir de [ici] (https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl) Plus d'infos [ici] (https://docs.mongodb.com/master/release-notes/3.6/) – Veeram