如何使用Unity JDBC驱动程序加入两个MongoDB集合?(How to Join two MongoDB Collections with the Unity JDBC driver?)

从Unity JDBC 下载页面

如果SQL查询需要MongoDB不支持的连接或函数,则查询将提升为UnityJDBC(试用版)。 UnityJDBC试用版没有到期日期,并且完全正常运行,但它仅限于返回最多100个结果。

但是,当我尝试使用任何语法连接两个表时

SELECT * from a, b WHERE a.id = b.id
SELECT * from a INNER JOIN b ON a.id = b.id
SELECT * from a INNER JOIN b USING (id)

结果如下:

Exception: java.sql.SQLException: ERROR: No schema defined.  The default schema location is _schema in the current database.  You need write permission to create this collection.  Otherwise, use the schema parameter to set a file location (e.g. schema=mongo.xml) to store the schema.  See connection parameters at http://www.unityjdbc.com/mongojdbc/ for more details.
java.sql.SQLException: ERROR: No schema defined.  The default schema location is _schema in the current database.  You need write permission to create this collection.  Otherwise, use the schema parameter to set a file location (e.g. schema=mongo.xml) to store the schema.  See connection parameters at http://www.unityjdbc.com/mongojdbc/ for more details.
    at mongodb.conn.ServerConnection.processMongoWithUnity(Unknown Source)
    at mongodb.conn.ServerConnection.executeQuery(Unknown Source)
    at mongodb.jdbc.MongoStatement.executeQuery(Unknown Source)
    at mongodb.ExampleMongoJDBC.doQuery(ExampleMongoJDBC.java:222)
    at mongodb.ExampleMongoJDBC.main(ExampleMongoJDBC.java:66)

好的,所以我查看了自述文件,发现它提到了代码/ test / dspec /文件夹,其中包含一些与模式相关的文件。 我打开了几个,它们是所有集合中非常详细的xml文件,将它们映射到关系数据类型。

我必须写出其中一个,还是有办法自动生成它?


From the Unity JDBC download page:

If the SQL query requires joins or functions not supported by MongoDB, then the query is promoted to UnityJDBC (trial version). The UnityJDBC trial version has no expiration date and is fully functioning except that it is limited to returning up to 100 results.

However, when I try to join two tables using any syntax like

SELECT * from a, b WHERE a.id = b.id
SELECT * from a INNER JOIN b ON a.id = b.id
SELECT * from a INNER JOIN b USING (id)

Results in the following:

Exception: java.sql.SQLException: ERROR: No schema defined.  The default schema location is _schema in the current database.  You need write permission to create this collection.  Otherwise, use the schema parameter to set a file location (e.g. schema=mongo.xml) to store the schema.  See connection parameters at http://www.unityjdbc.com/mongojdbc/ for more details.
java.sql.SQLException: ERROR: No schema defined.  The default schema location is _schema in the current database.  You need write permission to create this collection.  Otherwise, use the schema parameter to set a file location (e.g. schema=mongo.xml) to store the schema.  See connection parameters at http://www.unityjdbc.com/mongojdbc/ for more details.
    at mongodb.conn.ServerConnection.processMongoWithUnity(Unknown Source)
    at mongodb.conn.ServerConnection.executeQuery(Unknown Source)
    at mongodb.jdbc.MongoStatement.executeQuery(Unknown Source)
    at mongodb.ExampleMongoJDBC.doQuery(ExampleMongoJDBC.java:222)
    at mongodb.ExampleMongoJDBC.main(ExampleMongoJDBC.java:66)

Ok, so I took a look in the readme and found it mentioning the code/test/dspec/ folder with some files related to schemas. I opened a few up, they are highly detailed xml files of all the collections mapping them to relational data types.

Do I have to write one of these out, or is there a way to auto generate it?


原文:https://stackoverflow.com/questions/25815632
2020-12-15 13:12

满意答案

我收到了Unity团队的(快速)回复。

MongoDB JDBC驱动程序有两种模式。 对于单个集合查询,它不构建架构。 对于涉及联接或表达式的查询,它构建一个模式,默认情况下将其存储在当前Mongo数据库的_schema集合中。 如果您没有写入数据库的权限,则会引发错误。

如错误中所述,您可以将schema参数设置为本地文件名(例如mongo.xml),并将其存储在您的计算机上而不是Mongo数据库中。 您还可以使用具有写入权限的帐户。

要使其工作,请将schema = mongo.xml添加到您的连接URL,如下所示:

jdbc:mongo://localhost/dbname?schema=mongo.xml?rebuildschema=true

在第一次完成此操作后,您可以删除rebuildschema = true,否则每次都会重建它。

我唯一困惑的是我使用的是不需要身份验证的数据库。 我甚至让一个具有写权限的用户连接到他,但仍然收到了上述错误。

- 编辑

我意识到你也可以只做jdbc:mongo://localhost/dbname?rebuildschema=true 。 如果尚未创建架构,则将抛出先前的错误。


I received a (fast) response from the Unity team.

The MongoDB JDBC driver has two modes. For single collection queries, it does not build a schema. For queries involving joins or expressions it builds a schema and by default stores it in the _schema collection in the current Mongo database. If you do not have permission to write to the database, an error is thrown.

As mentioned in the error, you can set the schema parameter to be a local file name (such as mongo.xml) and it will store it on your computer rather than in the Mongo database. You could also use an account that has write permissions.

To make this work, add schema=mongo.xml to your connection URL like this:

jdbc:mongo://localhost/dbname?schema=mongo.xml?rebuildschema=true

After this is done the first time, you can remove the rebuildschema=true or it will rebuild it every time.

The only thing I'm confused about is that I'm using a database which doesn't require authentication. I even made a user with write permissions, connected to him, and still received the above error.

--EDIT

I realized that you could also just do jdbc:mongo://localhost/dbname?rebuildschema=true. If the schema hasn't been created, then the previous error will be thrown.

相关问答

更多

使用Unity 3注册集合的更清洁方式(Cleaner way to register collections with Unity 3)

Unity 3 按惯例添加了注册来处理这样的案例...... //There's other options for each parameter (and you can supply your own custom options) container.RegisterTypes( AllClasses.FromLoadedAssemblies(). Where(type => typeof(IPrePopulationModule).IsAssignableFrom(...

本地MongoDB驱动程序Node.js - 我们应该存储集合吗?(Native MongoDB Driver Node.js - should we store collections?)

IMO,这不是一个好习惯。 database.ts的用户必须确保在使用它们之前已初始化这些集合。 我甚至不会导出任何内部集合,因为用户永远不应该关心数据库的结构。 您应该导出一些操作函数,如function addUser(user: User) {/.../} 。 MS创建了一个简洁的代码示例 。 //编辑。 是的,您可以在内部存储集合引用,这样您就不必每次都输入集合名称。 通过忽略单数和复数来引入错误很容易。 最佳做法是: import mongodb = require('mongodb')...

具有连接字符串的MongoDB C#驱动程序更新集合(MongoDB C# Driver Update Collection with Concatenated string)

这将是我的Shell脚本 var cursor = db.MyCollection.find({ "Id": 21 }), // Or what ever your find conditions is bulkUpdateOps = []; cursor.forEach(function(doc){ var ConcatField = doc.Field1 + doc.Field2 + doc.Field3 ; bulkUpdateOps.push({ ...

如何使用Unity JDBC驱动程序加入两个MongoDB集合?(How to Join two MongoDB Collections with the Unity JDBC driver?)

我收到了Unity团队的(快速)回复。 MongoDB JDBC驱动程序有两种模式。 对于单个集合查询,它不构建架构。 对于涉及联接或表达式的查询,它构建一个模式,默认情况下将其存储在当前Mongo数据库的_schema集合中。 如果您没有写入数据库的权限,则会引发错误。 如错误中所述,您可以将schema参数设置为本地文件名(例如mongo.xml),并将其存储在您的计算机上而不是Mongo数据库中。 您还可以使用具有写入权限的帐户。 要使其工作,请将schema = mongo.xml添加到您...

使用MongoDb C ++驱动程序查询大型集合与shell不同(Query on large collections using the MongoDb C++ driver differs from shell)

索引和排序是不同的概念。 您可以在索引中查找数据而无需对结果进行排序; 您也可以在不使用索引的情况下对结果进行排序(但不建议这样做)。 由于您尚未为find()指定排序顺序,因此结果将按自然顺序返回。 对于仅插入文档(并且从不删除或更新)的集合 ,自然顺序应近似于插入顺序(除非您恰好使用上限集合 ,该集合按插入顺序维护)。 一旦您开始删除文档或更新它们(这可能会导致它们被移动),MongoDB的预分配数据文件中将创建可用空间“间隙”。 MongoDB将重用可用空间用于新文档插入/移动..因此,随着...

MongoDb - 两个集合中的“join”或$(MongoDb - “join” or $in two collections)

您不能使用agregation框架,因为它涉及两个不同的集合。 你必须把每个女性的身份都发现在女性系列中。 You can't do it with the agregation framework because it involves two diferent collections. You must take each women id and find it in women array of fellas collections.

Android Unity插件(Android Unity plugin)

要查看插件的返回值,请将代码从Update更改为OnGUI 。 To see the return value from a plugin, move the code to OnGUI from Update.

MongoDb - “加入”集合[复制](MongoDb - “Join” Collections [duplicate])

合并多个集合或对数据进行任何重塑的唯一方法,例如分组,取消组合(展开)是使用聚合框架(推荐)或较早的地图缩小框架(推荐使用较少)。 具体来说,汇总时您有多种汇总步骤供您选择,包括$ lookup 。 从简要的数据看,您需要在Message集合中汇总MessageEvent集合和查找数据(因为ID指向MessageEvent到Message对象,反之亦然)。 您有$ project,$ group阶段可以帮助您重新塑造数据。 The only ways to combine multiple col...

在MongoDB中使用MapReduce加入两个集合(Join two collections with MapReduce in MongoDB)

在你的问题中, first_name只能从Employees集合中获取,而dep_name只能从Departments集合中获取。 您可以使用MapReduce和聚合框架来实现它。 1. MapReduce解决方案 如果您按照以下方式修改地图并减少功能 var mapD = function() { for (var i=0; i<this.employees.length; i++) emit(this.employees[i], { dep_id: this._id, dep_na...

mongodb java加入两个集合(mongodb java to join two collections)

for each retrieved user find every comments for this user 或使用DBRef for each comment DBRef::fetch(comment.user) for each retrieved user find every comments for this user or using DBRef for each comment DBRef::fetch(comment.user)

相关文章

更多

Solr从Mongodb索引数据(上) 借助mongodb-jdbc和配置JdbcDataSource

Mongodb越来越流行,这边也用Mongodb去存储大量数据.但碰到一个问题,如何通过Solr从Mo ...

About Unity3D 4.1.2 (to continue…)

Here are something that need to take care of when y ...

MongoDB学习(三):MongoDB Shell的使用

MongoDB自带简洁但功能强大的JavaScript shell。JavaScript shell键 ...

JDBC 连接管理

public class ConnectionUtil { public static final ...

jdbc连接oracle、mysql等主流数据库的驱动类和url

jdbc连接oracle、mysql等主流数据库的驱动类和url oracle driverClas ...

3DMark Sky Driver

Futuremark今天宣布,3DMark Sky Diver测试场景已经正式发布,现有用户可以免费更 ...

mongodb添加集合文档操作-使用shell和java操作mongodb文档

查看当前数据库中所有的集合,使用命令 show collections 或使用show tables ...

MongoDB: The Definitive Guide

How does MongoDB help you manage a huMONGOus amount ...

MongoDB之Hadoop驱动介绍

1. 一些概念 Hadoop是一套Apache开源的分布式计算框架,其中包括了分布式文件系统 ...

solr mongoDB 对比

1 solr 字段是写死的 2 solr优势是大块文本模糊查询,mongoDB还支持正则查询以及类似j ...

最新问答

更多

在循环中组合来自单独表的点(Combine points from separate tables in a loop)

试试这个查询: SELECT m.id, m.title, sum(if(aw.film_nominated = 1,a.nom_points,0)) AS total_nom_points, sum(if(aw.film_won = 1,a.win_points,0)) AS total_win_points, sum(if(aw.film_nominated = 1,a.nom_points,0))

如何将域本体与WordNet同义词链接?(How to link a domain ontology with WordNet synsets?)

据我所知,没有适用于Protégé4.3或更高版本的插件。 (我查看了WordNet普林斯顿相关项目页面,Ontoling是一个有人创建的插件,但它只适用于Protégé3.2)。 你可能不得不诉诸 1)回归到更古老的Protégé版本。 2)使用Java(或您首选的编程语言)api for wordnet(如JAWS)以及基于本体框架的Java(再次偏好)(如OWL API或Apache Jena)来创建这些链接。 3)自己为WordNet写一个Protégé插件! As far as I k

在WPF C#中的ListView中将项目拖放到特定索引中(Drop Item into Specific Index in ListView in WPF C#)

WPF并不是真的被设计成以这种方式使用。 虽然你可以强力将ListViewItem直接添加到ListView,但它真正应该工作的方式是你有一些类型的集合( ObservableCollection可以正常工作)并将ListView的ItemsSource属性绑定到该集合。 那么答案很简单。 您可以使用带有索引的集合的Insert方法,而不是Add方法。 至于找到鼠标事件发生的ListViewItem,可以使用VisualTreeHelper.HitTest方法。 WPF is

Swift未声明的类型和构建设置(Swift undeclared type and build settings)

在ViewController.Swift放入以下语句 import calendarView 编辑: 请确保在目标的构建设置中正确设置Library Search Path ,如下所示。 路径应该与您的.xcodeproj文件相关。 Put following statement in your ViewController.Swift import calendarView Edit: Please ensure to set Library Search Path correctly

React Material UI - 导出多个高阶组件(React Material UI - Export multiple higher order components)

看看它在material-ui文档站点中的处理方式,特别是在AppFrame组件中: export default compose( withStyles(styles, { name: 'AppFrame', }), withWidth(), connect(), )(AppFrame); 他们正在使用重组来执行此操作。 所以在你的情况下,这将是: import React, { Component } from 'react'; import compose fro

PHP Post自动登录登录(PHP Post Automatic login Login)

当您在该站点上时,您将登录并在此之后转到所需的页面。 该网站允许您到达那里,因为他们通常有一个存储您的数据的会话。 因此,基本上您需要基于cURL模拟系统中的会话。 如果您认为会话的工作原理,您会发现您很可能需要接受cookie,其中该站点将存储会话ID。 所以这也是你需要用cURL做的。 你需要给它一个存储cookie的方法。 所以你可以像这样使用curl_setopt函数: curl_setopt($ch, CURLOPT_COOKIEJAR, '/path/to/cookie.txt');

Git for Windows,将GIT_SSH设置为shell文件会导致“错误:无法生成:没有这样的文件或目录”(Git for Windows, setting GIT_SSH to a shell file causes causes “error: cannot spawn : No such file or directory”)

由于一些完全无法解释的原因,我可以验证它现在在cmd和git bash中都有效,而之前没有。 现在开始为ssh创建一个git-repo预处理器,这样多账户用户就可以更轻松了。 For some totally unexplained reason, I can verify that NOW it works in both cmd and git bash whilst it didn't before. Now on to creating a git-repo preprocessor f

从php代码安装debian驱动器(Mounting a drive in debian from php code)

我有一个疯狂的想法...... 您可以将cron设置为以root身份运行,以检查脚本中的mount命令。 该脚本只需设置要处理的mount命令,当cron到达它时,运行mount,将命令标记为已处理,然后写入日志文件,然后可以显示该日志文件。 I have a wild idea... You could set a cron to run as root that checks for mount commands from your script. The script would simp

使用XCUIApplication和覆盖窗口的OSX UI测试(OSX UI testing with XCUIApplication and covered windows)

要点击某个特定窗口之前,请执行以下操作。 [[[XCUIApplication alloc] init].windows[@"Window"] click]; To focus a specific window before clicking something inside it, do the following. [[[XCUIApplication alloc] init].windows[@"Window"] click];

计时器环绕灵活的位大小(Timer wraparound with flexible bit sizes)

您可以向上乘以而不是符号扩展,以使整个范围与算术类型的大小相同。 换句话说,使用定点算术来填充整数。 在你的情况下,用uint32_t ,看起来像 uint32_t start = GetSomePlatformSpecificTimer(); RunSomeOtherCode(); uint32_t end = GetSomePlatformSpecificTimer(); start <<= 32-COUNTER_WIDTH; end <<= 32-COUNTER_WIDTH; uint32