当您在下一个查询中需要相同集合的结果时,如何执行嵌套查询?
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);
});
});
});
});
Run Code Online (Sandbox Code Playgroud)
但它不喜欢我两次调用相同的集合'MyCollection'.我正在尝试获取其源或目标涉及secondResults的任何文档.
你应该摆脱打开'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);
});
});
Run Code Online (Sandbox Code Playgroud)
但是你已经有了一个'MyCollection'实例:
mongoDB.collection('MyCollection', function(err, collection) {
collection.find({ $or: [{ 'source': {$in: myArray} },{ 'target': {$in: myArray} }]}, { "someVar": 0}).toArray(function(err, firstResults) {
Run Code Online (Sandbox Code Playgroud)
因此,第二次调用'collection'是在第一次调用的范围内,您可以(并且应该)重用该实例:
collection.find({ $or: [{ 'source': {$in: secondResults} },{ 'target': {$in: secondResults} }]}, { "someVar": 0}).toArray(function(err, items) {
res.send(items);
});
Run Code Online (Sandbox Code Playgroud)
或者,如果您正在使用node-mongodb-native,您可以查看一些示例,以了解其他方法来完成您所追求的内容.
这段代码适合我:
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();
});
});
});
Run Code Online (Sandbox Code Playgroud)
请注意,上面的代码使用的是node-mongodb-native 1.3.19版.从版本1.2开始,建议在与Node.js驱动程序中的mongodb交互时使用MongoClient.
| 归档时间: |
|
| 查看次数: |
2022 次 |
| 最近记录: |