我来自MongoDB,现在我想使用ArangoDb来使用ACID Transactions。我只使用NodeJS进行编程。
我遇到的问题是以下,我无法将NPM代码示例变为现实!
有3个NPM软件包,其中包含NodeJS驱动程序。 这些代码示例都没有起作用!
然后,当我尝试使用HTTP REST API时,它们至少部分工作。 以下是一种访问ArangoDB的HTTP REST API方法。
但是,如何在文档应该插入的数据库中指定?它总是将其插入_System-Database中。我不想要的。
在这里,您可以看到我的代码..
var restify = require('restify');
// Client
var client = restify.createJsonClient({
url: 'http://192.168.142.139:8529',
version: '~1.0'
});
// Now call this insert function to insert a new Document into the ArangoDB Database
insert (function(e,o){
});
function insert ( callback) {
var data = {
user : 'Harryblabla',
nicenumber : 8675,
nicestring : 'des04950'};
client.post('/_api/document?collection=testcollection1&createCollection=true&waitForSync=true',
data, function (err, req, res, obj) {
if (obj.error==false) {
console.log('ok - saved');
console.log('result '+JSON.stringify(obj));
callback (err, 1);
} else {
console.log('not saved');
callback ('error', null);
}
});
}
它确实在'testcollection1'中插入了Document,但是如何指定数据库?
另外,您能否举例说明如何在字段上使用唯一索引'ensureIndex','更新$ set用于设置字段,以及findOne,就像在MongoDB中一样?
您也可以使用其中一个NPM包编写代码。但我带来的唯一方法是通过HTTP REST Api ..
拜托,谢谢。我喜欢ArangoDb,因为它的开源,提供ACID交易。但主要的缺点是缺乏教程,缺乏示例代码......
*我还需要:更新Collection中的字段,如果不存在则创建它:*
在这里,您可以看到有关如何仅更新特定字段的NodeJS + MongoDB示例。如果它不存在,它将被创建。这正是我在Nodejs中对ArangoDB所需要的。你能给我举个例子吗?请
// Mongo DB connection already opened.
// this is the function to update or create if not exists
mycollection.update({txid: tx.txid},
{$set: {txid: tx.txid, nice: tx.nice, confvalidated: true}}, {upsert: true}, function(err, records1){
if (records1) {
console.log('insertreceived: Amount '+tx.nice+' C: '+tx.confirmations+ 'INSERT RECEIVED: '+tx.txid);
callback(null, records1);
} else {
//callback('error');
callback('error', null);
}
});
答案 0 :(得分:6)
还有一个Javascript/Node.js驱动程序,可以继续为ArangoDB开发(确认使用2.0)。在此驱动程序的自述文件中,有一些示例如何安装和使用它,文档可用here。如果这不适合您,请将您的问题发送给我们错误报告,然后我们将解决问题。
作为更新问题的代码示例(我刚刚使用了您在MongoDB示例中使用的相同对象,tx.txid必须是文档的_id属性。)您可以使用:
var arango = require('arangojs');
var db = arango.Connection('http://127.0.0.1:8529');
mydb = db.use("yourDatabaseName");
mydb.document.patch(tx.txid, {
nice: tx.nice,
confvalidated: true
});
答案 1 :(得分:4)
您的集合最终都在_system
数据库中的原因是因为您未在URL中使用数据库。如果你想使用例如my_database
代替默认数据库(即_system
),您应该使用/db/my_database/_api/
而不是/_api/
。您可以在[HTTP API for databases]中找到有关使用多个数据库的更多信息。
我对MongoDB不是很熟悉,但我认为相当于ensureIndex
的{{1}}集合将使用相同的参数和数据发布到/_api/index
集合。根据{{3}},如果索引已经存在,服务器将使用200
回答,如果已创建索引,则回复201
。
相当于$set
可能是对文档的补丁,它将更新文档而不是覆盖它。来自API documentation for indices:
如果现有文档尚不存在,则补丁文档中的所有属性都将添加到现有文档中,如果现有文档中存在,则会覆盖现有文档。
最接近的findOne
可能是the documentation on HTTP PATCH for documents。它仅支持完全匹配,但是,对于实际查询,您应该使用它的查询语言firstExample
simple query。
我是其中一个node.js" drivers"的作者。对于我停止使用的ArangoDB。我决定不继续开发它的原因是直接使用HTTP API可能不是在项目中集成ArangoDB最有用的方法。
ArangoDB带有自己的JavaScript环境which also has an HTTP API。您不必通过线路发送查询字符串并在节点代码中调用多个REST端点,而是使用Foxx创建自己的特定于域的HTTP API,这样可以让您抽象出基础数据库特定的调用。除了为您提供涵盖HTTP API全部功能的纯JS API之外, Foxx还允许您在失败时自动回滚执行事务。
如果你可以编写node.js代码,你可以编写Foxx代码。 Foxx包含一个可以帮助您入门的教程。如果您使用过ArangoDB的交互式外壳程序arangosh
,那么您很高兴知道如果您在使用Foxx时遇到问题,可以在Foxx代码中使用相同的API #39;模型逻辑。
使用Foxx的唯一缺点是你需要将你的Foxx应用程序部署到数据库(除了将node.js代码部署到你的node.js服务器之外),但实际上这不应该让你的项目的部署更加困难。
答案 2 :(得分:2)