MongoDB嵌套了相同集合的集合查询

时间:2013-11-11 15:53:28

标签: mongodb

如果在下一个查询中需要相同集合的结果,如何进行嵌套查询?

var mongo = require('../config/mongo');

var mongoDB = mongo.db;
...

exports.myFunction = function(req, res) {

...
...
// e.g. myArray = ['a','b','c'];

mongoDB.collection('MyCollection', function(err, collection) {
    collection.find({ $or: [{ 'source': {$in: myArray} },{ 'target': {$in: myArray} }]}, { "someVar": 0}).toArray(function(err, firstResults) {

            var allResults = [];
            for (var i = 0; i < firstResults.length; i++) {
                allResults[firstResults[i].source]=1;
                allResults[firstResults[i].target]=1;
            };

            var secondResults = Object.keys(allResults);

            mongoDB.collection('MyCollection', function(err, collection) {
                collection.find({ $or: [{ 'source': {$in: secondResults} },{ 'target': {$in: secondResults} }]}, { "someVar": 0}).toArray(function(err, items) {
                    res.send(items);
                });
            });


    });
});

但它不喜欢我两次调用相同的集合'MyCollection'。我正在尝试获取其源或目标涉及secondResults的任何文档。

1 个答案:

答案 0 :(得分:5)

你应该摆脱打开'MyCollection'的第二次调用。打开一次后,您已经有了一个'MyCollection'对象。也就是说,你有这个:

mongoDB.collection('MyCollection', function(err, collection) {
  collection.find({ $or: [{ 'source': {$in: secondResults} },{ 'target': {$in: secondResults} }]}, { "someVar": 0}).toArray(function(err, items) {
    res.send(items);
   });
});

但是你已经有了一个'MyCollection'实例:

mongoDB.collection('MyCollection', function(err, collection) {
  collection.find({ $or: [{ 'source': {$in: myArray} },{ 'target': {$in: myArray} }]}, { "someVar": 0}).toArray(function(err, firstResults) {

因为第二次调用'collection'是在第一次调用的范围内,你可以(并且应该)重用该实例:

collection.find({ $or: [{ 'source': {$in: secondResults} },{ 'target': {$in: secondResults} }]}, { "someVar": 0}).toArray(function(err, items) {
  res.send(items);
});

或者,如果您使用的是node-mongodb-native,则可以查看some of the examples,了解其他实现目标的方法。

更新1

此代码适用于我:

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

  var collection = db.collection('c');
  var secondQuery = {};

  collection.find({a:'b'}).toArray(function(err, firstRes){
    for(var i = 0; i < firstRes.length; i++){
      secondQuery[firstRes[i].a] = firstRes[i].b;
    }

    collection.find(secondQuery).toArray(function(err, secondRes){
      for(var i = 0; i < secondRes.length; i++){
        console.log(secondRes[i]);
      }

      db.close();
    });
  });
});

更新2

请注意,上面的代码使用的是node-mongodb-native version 1.3.19。从版本1.2开始,it is recommended to use MongoClient与Node.js驱动程序中的mongodb进行交互。