2017-06-24 3 views
-5

私が基本的にやりたいことは、ユーザーがグループに参加しているかどうかに基づいて、フロントエンド(react.js)上で異なる外観を表示することです。条件付きクエリを試み、フロントエンドなどでループしました。MongoDB(node.js)で条件付きでデータを照会する最良の方法は何ですか?

この問題に取り組むにはどうすればよいですか?

私の最後の試みを集約したが、それは任意の値を返しません:ユーザがグループの一部であるか否かを判断する機能MongoDBのクエリを思い付く

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

     } 
    ] 
      ) 
+0

"ユーザーがグループに参加しているかどうかに基づいています" - あなたはその条件について詳しく説明し、試したコードの一部を含めることができますか? –

+0

問題は、私が試みたものが何とか失敗したことです。 – TheGabornator

+0

私が欲しいのは、例えば次のようなものです。フェイスブック。あなたがグループにいない限り、参加ボタンが表示されます。あなたがいるとすぐに、離れるボタンが表示されます。単純な理論の中でその背後にあるプロセスは何ですか? – TheGabornator

答えて

1

はどのように理解する必要がありますあなたはあなたのデータベースとグループのコレクションを構成しています。

{ 
    "_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>" 
     }, 
     .... 
    ] 
} 

あなたのグループ文書/オブジェクトなど、それの名前、作成日、説明、のようなものの属性を持つことができる属性の一つは、使用することができ、「group_membersです」のようになります。それを構造化する一つの方法は、そうは以下のようです(IDに基づいて)ユーザーが特定のグループの一部であるかどうかを確認するためにクエリを実行するとき

MongoDB $elemMatch演算子は、あなたのユースケースを満たすのに最適な選択肢です(例1と同様のグループデータ構造を使用している場合は、Array of Embedded Documentsのセクションをご覧ください)。 1つのまたは0のいずれかの結果を返す

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

1その_idとグループと指定されたユーザIDを持つ要素が含まgroup_members配列が存在する場合、それ以外の場合は0

:のようなクエリ。 Nodeでこれを使用するには、 Webサーバと連携して:それまで、あなたはURL http://localhost:3000/partOfGroup?groupId=594ea5bc4be3b65eeb8705d8&userId=12345に行くことができますし、それは返す必要があり、実行中で

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'); 
}); 

ID 12345とID 594ea5bc4be3b65eeb8705d8ユーザとグループがあるかどうに応じて、真または偽そのグループで

フロントエンドコードから、ログインしたユーザーがグループページにアクセスし、グループIDとユーザーIDを適切に置き換えると、そのURLにリクエストを送信します。あなたが得た応答は、 "Join"か "Leave"ボタンを表示するかどうかを決定します。

+0

ありがとう、それは華麗に見えます。明日それを試すのを待つことができません。 – TheGabornator

関連する問題