2017-10-02 2 views
0

J'essaie de trouver tous les objets avec type == 1 (fonctionne déjà) et, puis vérifier les doublons des adresses e-mail. (Ne fonctionne pas)requête mongo: supprimer l'objet lorsque les objets ont des valeurs correspondantes (email)

sortie serait quelque chose comme ceci:

[ { _id: 
{ id: 59d0e3f728150e39b008013f, 
    firstName: 'pera', 
    lastName: 'pekko', 
    phone: '04040404040', 
    massageType: 'jipii massage', 
    time: 45, 
    price: 30, 
    startsAt: '2017-10-02T11:00:00+03:00', 
    endsAt: '2017-10-02T11:45:00+03:00' }, 
email: [ '[email protected]' ], 
{ _id: 
{ id: 59ce25975f4d1a096cdd2733, 
    firstName: 'sdad', 
    lastName: 'autismus', 
    phone: '04040404040', 
    massageType: 'jipii massage', 
    time: 60, 
    price: 33, 
    startsAt: '2017-10-02T12:45:00+03:00', 
    endsAt: '2017-10-02T13:45:00+03:00' }, 
email: [ '[email protected]' ] 
}] 

Donc, fondamentalement, il vérifierait en double -values ​​"e-mail". S'il y a une valeur en double -> retirer l'objet WHOLE du résultat.

Mon code jusqu'à présent (imprime résultat tous les objets de type == 1 avec doublons):

 db3.massagerTimes.aggregate(
     {$match: {_id: mongo.helper.toObjectID(data.timesData)}}, 
     {$unwind: "$times"}, 
     {$match: {"times.type": 1}}, 
     { 
      $group: { 
       _id: { 
        id: "$times._id", 
        firstName: "$times.firstName", 
        lastName: "$times.lastName", 
        phone: "$times.phone", 
        massageType: "$times.massageType", 
        time: "$times.time", 
        price: "$times.price", 
        startsAt: "$times.startsAt", 
        endsAt: "$times.endsAt" 
       }, 
       email: {$addToSet: "$times.email"}, 
       count: {"$sum": 1} 
      } 
     }, 
     { 
      $match: { 
       count: {"$lte": 1} 
      } 
     }, 
     {$sort: {"times._id": -1}}, 
     function (err, result) { 
      if (err) 
       throw err; 

      if (result) { 
       console.log(result); 
       res.json(result); 
      } 
     }); 
} 

Collection:

{ 
"_id": { 
    "$oid": "59ca4eb610b3be1f8499f6d5" 
}, 
"times": [ 
    { 
     "_id": { 
      "$oid": "59ce274f5f4d1a096cdd2745" 
     }, 
     "type": 0, 
     "startsAt": "2017-10-02 13:30 +03:00", 
     "endsAt": "2017-10-02 13:45 +03:00" 
    }, 
    { 
     "_id": { 
      "$oid": "59ce274f5f4d1a096cdd2744" 
     }, 
     "type": 0, 
     "startsAt": "2017-10-02 13:15 +03:00", 
     "endsAt": "2017-10-02 13:30 +03:00" 
    }, 
    { 
     "_id": { 
      "$oid": "59ce28415f4d1a096cdd275b" 
     }, 
     "title": "sdad autismus", 
     "firstName": "sdad", 
     "lastName": "autismus", 
     "type": 1, 
     "email": "[email protected]", 
     "phone": "04040404040", 
     "massageType": "jipii massage", 
     "time": 45, 
     "price": 30, 
     "additionalInfo": null, 
     "startsAt": "2017-10-01T08:30:00+03:00", 
     "endsAt": "2017-10-01T09:15:00+03:00" 
    }, 
    { 
     "_id": { 
      "$oid": "59ce28665f4d1a096cdd275e" 
     }, 
     "title": "sdad autismus", 
     "firstName": "sdad", 
     "lastName": "autismus", 
     "type": 1, 
     "email": "[email protected]", 
     "phone": "04040404040", 
     "massageType": "jipii massage", 
     "time": 45, 
     "price": 30, 
     "additionalInfo": null, 
     "startsAt": "2017-10-01T09:30:00+03:00", 
     "endsAt": "2017-10-01T10:15:00+03:00" 
    }, 
    { 
     "_id": { 
      "$oid": "59d0e3f728150e39b008013f" 
     }, 
     "title": "pera pekko", 
     "firstName": "pera", 
     "lastName": "pekko", 
     "type": 1, 
     "email": "[email protected]", 
     "phone": "04040404040", 
     "massageType": "some massage", 
     "time": 45, 
     "price": 30, 
     "additionalInfo": null, 
     "startsAt": "2017-10-02T11:00:00+03:00", 
     "endsAt": "2017-10-02T11:45:00+03:00" 
    } 
] 
} 

Question: Comment puis-je vérifier les doublons de valeur, puis déposez-le de résultats? (dans ce cas [email protected] < - 2x, supprimer doublon, non seulement la valeur en double)

Répondre

1

Le cœur de ce que vous avez besoin serait quelque chose comme ça:

db3.massagerTimes.aggregate({ 
    $unwind: "$times" 
}, { 
    $group: { 
     _id: "$times.email", // group all items with the same email together 
     doc: {$first: "$$ROOT"} // keep only the first document for each email address 
    } 
}, { 
    $replaceRoot: { 
     newRoot: "$doc" // move the element we remembered during the grouping stage to the top of our document 
    } 
});