2017-06-24 6 views
-5

Was ich im Grunde versuche zu tun, ist auf dem Front-End (react.js) unterschiedlich aussehen, basierend darauf, ob der Benutzer Teil der Gruppe ist oder nicht. Ich versuchte bedingte Abfragen, Schleifen auf Front-End usw.Wie kann man Daten in MongoDB (node.js) am besten abfragen?

Was wäre Ihr Ansatz, um dieses Problem anzugehen?

Mein letzter Versuch war eine Aggregation, aber es gibt nicht einen beliebigen Wert:

 Role.aggregate(
     [ 
     { 
      $project: {_id: roleID, 
      UserInRole: { $cond: { 
      if:{ userList: { $in: [userID]}}, then: true, else: false} }} 

     } 
    ] 
      ) 
+0

"basierend darauf, ob der Benutzer Teil der Gruppe ist oder nicht" - können Sie diese Bedingung genauer ausführen und einen Teil des Codes einbeziehen, den Sie ausprobiert haben? –

+0

Das Problem ist, dass alles, was ich versuchte, fehlgeschlagen ist. – TheGabornator

+0

Was ich will ist etwas wie z.B. Facebook. Solange Sie nicht in einer Gruppe sind, sehen Sie eine Join-Schaltfläche. Sobald du drin bist, siehst du den Leave-Button. Was ist der Prozess dahinter in der einfachen Theorie? – TheGabornator

Antwort

1

mit einem funktionierenden MongoDB Abfrage zu entwickeln, die feststellt, ob ein Benutzer ein Teil einer Gruppe ist, erfordert ein Verständnis dafür, wie Sie strukturieren Ihre Datenbank- und Gruppensammlung. Eine Möglichkeit, das zu strukturieren ist etwa so:

{ 
    "_id" : ObjectId("594ea5bc4be3b65eeb8705d8"), 
    "group_name": "...", 
    "group_members": [ 
     { 
      "user_id": ObjectId("<same one from users collection"), 
      "user_name": "Alice", 
      "user_profile_picture": "<link_to_imag_url>" 
     }, 
     { 
      "user_id": ObjectId("<same one from users collection"), 
      "user_name": "Bob", 
      "user_profile_picture": "<link_to_imag_url>" 
     }, 
     .... 
    ] 
} 

Ihre Gruppe Dokument/Objekt kann Attribute für Dinge wie seinen Namen, das Erstellungsdatum, Beschreibung, etc. Eines der Attribute sollten „group_members“ sein, die verwendet werden können, Wenn Sie Ihre Abfrage ausführen, um festzustellen, ob ein Benutzer (basierend auf der ID) Teil einer bestimmten Gruppe ist.

Die MongoDB $elemMatch Betreiber scheinen wie eine große Auswahl Ihres Anwendungsfall gerecht zu werden (wenn Sie eine ähnliche Gruppe Datenstruktur Beispiel einer Verwendung sind. Weiter auf dieser $ elemMatch Seite nach unten ist ein Abschnitt über Array of Embedded Documents. Sie a tun können Abfrage wie:.

db.groups.find({ 
    _id: ObjectId("<id of group you're checking"), 
    group_members: { 
     $elemMatch: { user_id: ObjectId("<user id of user you're checking>") } 
    } 
}) 

, die entweder 1 oder 0 Ergebnisse angezeigt werden 1, wenn es eine Gruppe mit diesen _id ist und ein group_members Array, das ein Element enthält, das den Benutzer-ID angegeben ist, sonst 0.

Um das in Node zu verwenden, können Sieverwendenin Verbindung mit einem Express Webserver:

var MongoClient = require('mongodb').MongoClient 
var ObjectID = require('mongodb').ObjectID; 
var express = require('express'); 
var app = express(); 
var bodyParser = require('body-parser'); 

app.use(bodyParser.urlencoded({extended: true})); 
app.use(bodyParser.json()); 

// Connection URL 
var url = 'mongodb://localhost:27017/test'; // change test to whichever db you added the collections to 

app.get('/partOfGroup', (req, res) => { 
    if (req.query.groupId == null || req.query.userId == null) { 
     return res.send('Must include both groupId and userId') 
    } else { 
     MongoClient.connect(url, function(err, db) { 
      var collection = db.collection('groups'); 
      collection.findOne({ 
       _id: ObjectID(req.query.groupId), 
       group_members: { 
        $elemMatch: { user_id: req.query.userId} 
       } 
      }, function(err, result) { 
       return res.send(result != null) 
      }) 
     }) 
    } 
}); 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000'); 
}); 

Damit und läuft, Sie http://localhost:3000/partOfGroup?groupId=594ea5bc4be3b65eeb8705d8&userId=12345 auf die URL gehen kann und es sollte wahr oder falsch zurückgeben, je nachdem ob eine Gruppe mit der ID gibt es 594ea5bc4be3b65eeb8705d8 und Benutzer mit ID 12345 in dieser Gruppe.

Stellen Sie von Ihrem Front-End-Code eine Anfrage an diese URL, wenn ein angemeldeter Benutzer eine Gruppenseite aufruft und die Gruppen-ID und Benutzer-ID entsprechend ersetzt. Die Antwort, die Sie erhalten, bestimmt, ob eine Schaltfläche "Beitreten" oder "Verlassen" angezeigt werden soll.

+0

Danke, das sieht genial aus. Ich kann es kaum erwarten, es morgen zu versuchen. – TheGabornator

Verwandte Themen