我是node.js的新手,所以我有一种感觉,这将是我所忽略的愚蠢,但我找不到能够解决问题的答案.我要做的是创建一个路径,创建一个新的子对象,将其添加到父的子数组,然后将子对象返回给请求者.我遇到的问题是,如果我将字符串id传递给findById,节点崩溃了
TypeError:Object {}没有方法'cast'
如果我尝试传入ObjectId,我会得到
CastError:对于路径"_id"处的值"[object Object]",转换为ObjectId失败
这是我的代码的大致轮廓:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId; //Have also tried Schema.Types.ObjectId, mongoose.ObjectId
mongoose.connect('mongodb://user:password@server:port/database');
app.get('/myClass/:Id/childClass/create', function(request, result) {
var id = new ObjectId(request.params.Id);
MyClass.findById(id).exec( function(err, myClass) {
if (err || !myClass) { result.send("error: " + err + "<br>" + JSON.stringify(id) || ("object '" + request.params.Id + "' not found: " + id)); return; }
var child = ChildClass();
myClass.Children.addToSet(child);
myClass.save();
result.send(child);
});
});
Run Code Online (Sandbox Code Playgroud)
如果我使用路径"/ myClass/51c35e5ced18cb901d000001/childClass/create"执行此代码,则这是代码的输出:
错误:CastError:对于路径"_id"{"path":"51c35e5ced18cb901d000001","instance":"ObjectID","validators":[],"setters":的值"[object Object]",Cast to ObjectId失败], …
我一直在努力想出一个我一直在努力的个人网络应用程序的数据库后端.由于我在数据中需要的灵活性,关系数据库是不可行的,并且可能存在某种形式的文档存储.当我了解图形数据库时,我觉得这将是完美的.
但是,我遇到了一个问题:我需要能够以某种方式定义一个三向关系.我还没有确定数据库,但我一直在修补Neo4j,所以我将使用Cypher来描述这个问题.
基本上,我从这开始:
(a:N)-[r:E]->(b:N)
Run Code Online (Sandbox Code Playgroud)
我需要的是一种将多个节点不仅与a和b相关联的方法,还包括r.这些其他节点将存储有关所有3的不同信息.我认为可能只有两种方法来处理:将关系存储在自己的节点中或存储对包含信息的节点的引用并创建伪边缘.我认为前者可能是一个更好的主意,给我们更像这样的东西:
(a:N)<-[:E]-(r:R)->[:E](b:N)
(s:S)->(a)
(s)->(r)
(s)->(b)
Run Code Online (Sandbox Code Playgroud)
所以,现在,这会导致查询数据的问题.使用图形数据库的重点是能够遍历图形.如果我做这样的事情,有没有办法在N型节点之间递归遍历?处理这个问题的正确方法是什么?我已经想到了几种不同的处理方式,但是所有这些都有它们的缺点.是否有一个特定的图形数据库本机支持这种类型的功能?
UPDATE
使用原始代码,我能够使用以下代码递归遍历节点:
MATCH (a:N)-[:E*]->(b:N)
RETURN a,b
Run Code Online (Sandbox Code Playgroud)
然而,一旦我将边缘拉出到超边缘,我无法弄清楚是否有一种方法能够递归地遍历图形到未确定的深度,因为我将交替节点类型.我正在寻找一些类似的东西
MATCH chain=((a:N)-[]->(r:R)-[]->(b:N))*
RETURN [nodes of type N along the chain]
Run Code Online (Sandbox Code Playgroud)
如果答案只是在创建超边缘时也在a和b之间创建边缘,那么我的问题就变成:有没有一种好方法可以确保边缘和超边缘一起被移除?基本上,让两者都感觉像是一种解决方案,而不是一种实际的解决方案.