Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongoDB:Aggregation-对于原生node.js驱动程序,是否存在与$lookup连接等效的连接?_Node.js_Mongodb - Fatal编程技术网

mongoDB:Aggregation-对于原生node.js驱动程序,是否存在与$lookup连接等效的连接?

mongoDB:Aggregation-对于原生node.js驱动程序,是否存在与$lookup连接等效的连接?,node.js,mongodb,Node.js,Mongodb,mongodb:2.1.3 在读了一些关于mongoDB 3.2的文章后,我对“$look”管道阶段进行左外equi连接感到兴奋 不幸的是,节点驱动程序似乎没有这个操作符。(我在中没有看到它,当我尝试使用它时,我得到了错误: 更新:以下是我尝试的代码 var cursor = db.collection('messagethreads').aggregate([ {"$match": { _id: new ObjectID(threadID)}

mongodb:2.1.3

在读了一些关于mongoDB 3.2的文章后,我对“$look”管道阶段进行左外equi连接感到兴奋

不幸的是,节点驱动程序似乎没有这个操作符。(我在中没有看到它,当我尝试使用它时,我得到了错误:

更新:以下是我尝试的代码

var cursor = db.collection('messagethreads').aggregate([
        {"$match": {
            _id: new ObjectID(threadID)}
        }, 
        {"$lookup": {
            from: "messages", 
            localField: "_id",
            foreignField: "threadID",
            as: "messagesList"}
        }
    ]);

    cursor.toArray(function(err,messages){
        if(err) {
            res.status(500).json(error);
        }
        else if(convo === null){
            res.status(400).end();
        }
        else{
            res.status(200).json(messages);
        }
    });
});
示例-ThreadMessage文档

{ 
    "_id" : ObjectId("56b4f52c0e6368c00630aee6"), 
    name: "Messages 1"
}
{
     "_id" : ObjectId("56b4f52c0e6368c00630af08"), 
     "author" : "Nick", 
     "text" : "Hello", 
     "threadID" : ObjectId("56b4f52c0e6368c00630aee6")
},
...
示例-消息文档

{ 
    "_id" : ObjectId("56b4f52c0e6368c00630aee6"), 
    name: "Messages 1"
}
{
     "_id" : ObjectId("56b4f52c0e6368c00630af08"), 
     "author" : "Nick", 
     "text" : "Hello", 
     "threadID" : ObjectId("56b4f52c0e6368c00630aee6")
},
...
预期结果

{
    "_id" : ObjectId("56b4f52c0e6368c00630aee6"), 
    name: "Messages 1",
    messageList:[
        {
         "_id" : ObjectId("56b4f52c0e6368c00630af08"), 
         "author" : "Nick", 
         "text" : "Hello", 
         "threadID" : ObjectId("56b4f52c0e6368c00630aee6")
        },
        ...
    ]
}
“MongoError:异常:无法识别的管道阶段名称:'$lookup'

您可以阅读更多关于连接的案例

问题:是否有一种与node.js本机驱动程序等效的方法?

驱动程序如何报告来自“服务器”的任何错误消息是“MongoError”异常,因此该错误表示连接到的服务器不是支持3.2或更高版本的服务器:

$lookup

在3.2版中新增。

对同一数据库中的未分块集合执行左外部联接,以筛选“联接”集合中的文档进行处理。$lookup阶段在输入文档中的字段与“联接”集合中的文档中的字段之间进行相等匹配

您始终可以通过database命令获取要连接的服务器版本。也可以在完整的可复制列表中:

var async=require('async'),
mongodb=require('mongodb'),
MongoClient=mongodb.MongoClient,
ObjectId=mongodb.ObjectId;
MongoClient.connect(“mongodb://localhost/test,函数(err,db){
异步系列(
[
函数(回调){
命令({“serverStatus”:1},函数(err,status){
console.log(status.version);
回调(err);
});
},
函数(回调){
async.each(['threadmessage','message'],函数(colname,回调){
colname.remove({},回调);
},回调);
},
函数(回调){
db.collection('threadmessage')。插入(
{
“_id”:ObjectId(“56b4f52c0e6368c00630aee6”),
“名称”:“消息1”
},
回拨
);
},
函数(回调){
db.collection('message')。插入(
{
“_id”:ObjectId(“56b4f52c0e6368c00630af08”),
“作者”:“尼克”,
“文本”:“你好”,
“线程ID”:对象ID(“56b4f52c0e6368c00630aee6”)
},
回拨
);
},
函数(回调){
var cursor=db.collection('threadmessage').aggregate([
{“$lookup”:{
“发件人”:“消息”,
“localField”:“\u id”,
“foreignField”:“threadID”,
“作为”:“消息列表”
}}
]);
cursor.toArray(函数(err,result){
log(JSON.stringify(result,未定义,2));
回调(err);
});
}
],
功能(err){
如果(错误)抛出错误;
db.close();
}
);
});
以及固定了驱动程序版本的package.json,只是为了表明没有驱动程序版本问题:

{
“名称”:“查找”,
“版本”:“1.0.0”,
“说明”:“,
“main”:“index.js”,
“脚本”:{
“测试”:“echo\”错误:未指定测试\“&退出1”
},
“作者”:“作者”,
“许可证”:“ISC”,
“依赖项”:{
“异步”:“^1.5.2”,
“mongodb”:“2.1.3”
}
}
提供支持的服务器版本的预期输出:

3.2.0
[
{
“_id”:“56b4f52c0e6368c00630aee6”,
“名称”:“消息1”,
“消息列表”:[
{
“_id”:“56b4f52c0e6368c00630af08”,
“作者”:“尼克”,
“文本”:“你好”,
“线程ID”:“56b4f52c0e6368c00630aee6”
}
]
}
]

因此,如果该列表未在您连接的数据库上返回
3.2.x
,则此处不支持
$lookup
管道操作,您将不得不求助于其他方法,例如拉入“相关”信息“客户端”相反。

驱动程序与此无关。聚合管道只是发送到服务器的序列化数据,没有任何解释(本机数据格式到BSON转换除外),因此不需要任何支持。只要服务器版本支持此操作(MongoDB 3.2或更高版本)然后,您发送给服务器的内容将被执行。@BlakesSeven我不明白-节点驱动程序的最新版本是2.1.6。我假设它将具有核心的所有功能,但当我尝试时失败了,并且节点本机驱动程序的文档显示$limit是聚合游标方法之一。该方法的哪一部分“驱动程序与此无关”很难理解。“驱动程序”实现的唯一一件事是
.aggregate()
方法(实际上是执行聚合的数据库命令的包装器)。管道的内容,就像任何查询一样,只是“内容”。对于“驱动程序”来说没有任何内容除了发送之外,不执行其他操作。驱动程序文档中没有查询或聚合运算符,除非有“帮助程序”不支持动态结构分配的语言的方法。JavaScript有。@BlakesSeven很酷,thx。只是考虑到驱动程序实现和核心之间的一些语法细微差别-我想我的错误可能是由一个简单的语法调整引起的。“零”语法差异。“管道”始终是一个“列表/数组”所有驱动程序实现中对象的参数。但是,如果您谈论的是代码中无法解决的“错误”,那么您的问题应该显示“不适用于您”的代码,而不是“适用于”的代码,并询问“我如何做相同的事情?”。如果不适用,则清除