2013-08-30 54 views
0

嗨,我有一個使用mongodb的expressjs應用程序。如何在數組字段中查找迭代

起初,我在我的「tvs」集合上找到了一個電視的ID,我知道了,但現在我想從其他集合「用戶」中找到所有用戶信息。

這是我爲每個集合JSON:

電視

{ 
    "_id" : ObjectId("5203af83396d285ea2ecff8f"), 
    "brand" : "LG", 
    "comments" : [{ 
     "user" : ObjectId("521dc636eda03d0f9cab3568"), 
     "text" : "Sold!" 
    }, { 
     "user" : ObjectId("521b2785eda03d0f9cab3566"), 
     "text" : "Nice TV" 
    }], 
    "model" : "47LS5600", 
    "price" : 499.0 
} 

用戶

{ 
    "_id" : ObjectId("521b2785eda03d0f9cab3566"), 
    "name" : { 
    "first" : "Ruben", 
    "last" : "Montes" 
    } 
} 

這是我的代碼

var tvs = db.collection("tvs"); 
var users = db.collection("users"); 

exports.findById = function (req, res) { 
    var id = req.params.id; 
    tvs.findOne({'_id': new BSON.ObjectID(id)}, function (err, tv) { 
     users.find({ _id : tv.comments.user_id }).toArray(function (err, items) { 
      res.send({ tv: tv, users: items }); 
     }); 

    }) 
} 

我需要知道如何從電視訪問集合的評論陣列來獲取發佈評論中的信息用戶

users.find({ _id : tv.comments.user_id }) 

回答

1

可以作爲使用批處理的做多一點的邏輯可以有效地搶用戶$in運營商。

var mongodb = require('mongodb') 
    , MongoClient = require('mongodb').MongoClient 
    , Server = require('mongodb').Server; 

MongoClient.connect('mongodb://127.0.0.1:27017/test', function (err, db) { 
    if (err) throw err; 

    var tvs = db.collection('tvs'); 
    var users = db.collection('users'); 

    var userNames = {}; 
    var tvId = new mongodb.ObjectID("5203af83396d285ea2ecff8f"); // hard-code 

    // find a TV 
    tvs.findOne({ _id : tvId }, function (err, tv) { 
     var allUserIds = []; 
     if (tv && tv.comments) { 
      // build a list of all user IDs used in comments 
      // this doesn't filter duplicates right now 
      allUserIds = tv.comments.map(function (comment) { 
       return comment.user; 
      }); 
     } 

     // using the list of UserIds, grab all of them ..., 
     // and just return the name 
     users.find({_id: { $in: allUserIds }}, { name: 1 }) 
      .toArray(function (err, users_list) { 
       // if we got some 
       if (users_list && users_list.length > 0) { 
        for(var i= 0, len = users_list.length; i < len ; i++) { 
         userNames[users_list[i]._id] = users_list[i].name; 
        } 
        console.log("All comments ========"); 
        // now all the usernames are indexed in userNames by Id 
        for(var i= 0, len = tv.comments.length; i < len ; i++) { 
         // swap id for name 
         tv.comments[i].user = userNames[tv.comments[i].user]; 
         console.log(tv.comments[i]); 
        } 
        db.close(); // done with everything for this demo 
       } 
      }); 
    }); 
}); 

我用find$in在一個單一的「電視」的評論中發現的所有userIds的數組。通過使用$in,它顯着減少了MongoDB獲取單個User文檔所需的調用次數。另外,使用第二個參數find,我已將返回的字段簡化爲name

僅供參考 - 我的確將結構簡化爲「名」而不是「第一」和「最後」。你當然可以改變它以符合你的確切需求。