mongoDB:Aggregation-对于原生node.js驱动程序,是否存在与$lookup连接等效的连接?
mongodb:2.1.3 在读了一些关于mongoDB 3.2的文章后,我对“$look”管道阶段进行左外equi连接感到兴奋 不幸的是,节点驱动程序似乎没有这个操作符。(我在中没有看到它,当我尝试使用它时,我得到了错误: 更新:以下是我尝试的代码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)}
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。只是考虑到驱动程序实现和核心之间的一些语法细微差别-我想我的错误可能是由一个简单的语法调整引起的。“零”语法差异。“管道”始终是一个“列表/数组”所有驱动程序实现中对象的参数。但是,如果您谈论的是代码中无法解决的“错误”,那么您的问题应该显示“不适用于您”的代码,而不是“适用于”的代码,并询问“我如何做相同的事情?”。如果不适用,则清除