如何在数组字段中进行迭代迭代

时间:2013-08-30 11:50:11

标签: mongodb express

您好我有一个使用mongodb的快递应用程序。

起初我在我的“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 } );
        }); 

    })
}

我需要知道如何从tvs集合中迭代注释数组以获取发表评论的info用户

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

1 个答案:

答案 0 :(得分: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与一个&#34; tv&#34;的评论中找到的所有userIds数组一起使用。通过使用$in,它显着减少了MongoDB获取单个User文档所需的调用次数。此外,使用find的第二个参数,我已将返回的字段缩减为name

仅供参考 - 我确实将您的结构简化为“名称&#39;而不是第一个&#39;并且&#39;最后&#39;您当然可以根据您的确切需求进行更改。