1

私はmongodbの初心者であり、以下で説明するこの問題について助けていただければ幸いです。

「ユーザー」と「バッグ」の 2 つのコレクションがあります。ユーザー コレクション スキームには {username, firstname, lastname} があり、bag コレクション スキーマには {username, bagname, bagimage} があります。

ユーザーのバッグを取得する際に、名と姓も表示したいと考えています。私の問題は、クエリを正しく組み立てることができないように見えることです。nodejs とmongojsドライバーを使用しています。以下は、すべてのバッグを取得するための私のクエリです

  thmConfig.db.bags.find({status: "1"}).sort({$natural:-1}, function(err, data) 
{
        var bagList = '{"bags":[';


     if( err || !data) res.send('[{"status": "0"}]');
        else data.forEach( function(innerData) {
            console.log(innerData.username);
            bagList += JSON.stringify(innerData)+",";

                 /*
                   This is where I would lke to also append the firstname from the 
                users collection

                   */

        });

    console.log(bagList.slice(0,1));
    res.write(magList.slice(0,-1));
    res.end(']}');
});     

これについての助けや指針をいただければ幸いです。ドライバーを変更する選択肢がないので、今のところmongojsを使用してこれを実装したいと考えています。

よろしくお願いします。

4

2 に答える 2

0

users コレクションから読み取り、この「結合」操作をプログラムで実行する以外に、選択肢はあまりないと思います。各バッグ (ループ内) ごとにユーザー ドキュメントを読み取るか、事前にユーザー コレクション全体をオブジェクトに読み取って、ユーザー名でルックアップを行うことができます。

于 2013-02-09T21:28:14.710 に答える
0

$inそのために演算子を使用できます。

擬似コード(っぽい):

// get an array of bags matching your query
db.bags.find({status: "1"}).sort({$natural:-1}, function(err, bags) {
  // get a list of usernames from the bags:
  var usernames = bags.map(function(bag) { return bag.username; });

  // perform query on user table: find all users for which we have a bag
  db.users.find({ username : { $in : usernames } }, function(err, users) {
    // create a mapping of username -> first name for easy lookup
    var usernames = {};
    users.forEach(function(user) {
      usernames[user.username] = user.firstname;
    });

    // map first names to bags
    bags.forEach(function(bag) {
      bag.firstname = usernames[bag.username];
    });

    // done: return it as JSON (no need to build a JSON string ourselves)
    res.send({ bags : bags });
  });
});
于 2013-05-15T14:04:28.067 に答える