Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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
Node.js 在节点中操作Mongo文档_Node.js_Mongodb_Express - Fatal编程技术网

Node.js 在节点中操作Mongo文档

Node.js 在节点中操作Mongo文档,node.js,mongodb,express,Node.js,Mongodb,Express,我正在用平均堆栈构建这个项目 在我的Mongo收藏中,我的文档具有以下结构: {u id, 艺术家, 相册} 每个文档都必须是唯一的,我让mongodb在添加文档时计算出Id的增量 我通过具有以下结构的url访问每个文档: 例如: 嗯。我读到在URL中使用mongo ID并不一定是件坏事。 让我担心的是,我经常在我的节点应用程序中使用newobjectid来获取文档 在删除乙烯基的路线中有一个例子: app.delete('/vinyls/:id', function(req, res) {

我正在用平均堆栈构建这个项目

在我的Mongo收藏中,我的文档具有以下结构: {u id, 艺术家, 相册}

每个文档都必须是唯一的,我让mongodb在添加文档时计算出Id的增量

我通过具有以下结构的url访问每个文档: 例如:

嗯。我读到在URL中使用mongo ID并不一定是件坏事。 让我担心的是,我经常在我的节点应用程序中使用
newobjectid
来获取文档

在删除乙烯基的路线中有一个例子:

app.delete('/vinyls/:id', function(req, res) {

    let vinyls = mongoUtil.vinyls(); // my Mongo collection
    vinyls.remove( {"_id": new ObjectId( req.param('id') ; // can't pass in the Id directly !
});
正确的方法是为我的文档id编程一个简单的整数计数器,而不是使用mongo对象\u id吗


非常感谢您的建议。

您当然可以这样更新。只需确保您的
req.param('id')
与您的
ObjectId

相同的24个字符字符串,确保您可以以这种方式进行更新。只需确保您的
req.param('id')
与您的
ObjectId

是相同的24个字符的字符串,您的设计是为了使用MongoDB的分布式特性,因此您可以保证即使有多个应用程序插入数据库(数据库也可以驻留在多个服务器中),您不会得到重复的
\u id

当然,您可以设计自己的方法为数据库创建主键。如果您确定您将永远不会使用多个应用程序插入数据库,并且如果您可以确定不会有重复的
\u id
,那么这可能是一个合理的解决方案

但是,请注意,MongoDB不像大多数关系数据库那样提供自动递增主键功能。这主要是因为MongoDB的设计考虑了可扩展性和水平可伸缩性。如果数据库始终包含在单个服务器中(如SQL),则自动增量字段将起作用。如果您的数据库分布在多个服务器上,那么递增字段将需要一个真实来源,这可能严重限制插入性能

编辑

请记住,如果将数据插入MongoDB而不提供
\u id
字段,ObjectId只是一个内置解决方案。你可以用任何你想要的东西来代替它,只要你能确定它是独一无二的

例如,在您的情况下,使用(艺术家+专辑)字符串的md5哈希可能是可行的,例如:

db.collection.insert({u id:md5(艺术家+专辑),艺术家:艺术家,专辑:专辑})

它可以提供一个合理独特的
\u id
。在本例中,
\u id
字段将包含一个普通的32个字符字符串。

旨在考虑MongoDB的分布式特性,因此您可以保证即使有多个应用程序插入数据库(数据库也可以驻留在多个服务器中),您不会得到重复的
\u id

当然,您可以设计自己的方法为数据库创建主键。如果您确定您将永远不会使用多个应用程序插入数据库,并且如果您可以确定不会有重复的
\u id
,那么这可能是一个合理的解决方案

但是,请注意,MongoDB不像大多数关系数据库那样提供自动递增主键功能。这主要是因为MongoDB的设计考虑了可扩展性和水平可伸缩性。如果数据库始终包含在单个服务器中(如SQL),则自动增量字段将起作用。如果您的数据库分布在多个服务器上,那么递增字段将需要一个真实来源,这可能严重限制插入性能

编辑

请记住,如果将数据插入MongoDB而不提供
\u id
字段,ObjectId只是一个内置解决方案。你可以用任何你想要的东西来代替它,只要你能确定它是独一无二的

例如,在您的情况下,使用(艺术家+专辑)字符串的md5哈希可能是可行的,例如:

db.collection.insert({u id:md5(艺术家+专辑),艺术家:艺术家,专辑:专辑})


它可以提供一个合理独特的
\u id
。本例中的
\u id
字段将包含一个普通的32字符字符串。

您的意思是我应该只使用Mongo本机id吗?它迫使我每次不想获取文档时都实例化ObjectId,这让我感觉很笨拙…
ObjectId
是mongo对_id的默认建议。在生成自己的唯一id时,您总是可以覆盖它,并在insert语句中为_id传递它。Meteor使用字符串代替ObjectId。您可以编写一个包装器,为插入调用传递一个唯一的_id字符串。您的意思是我应该只使用Mongo本机id?它迫使我每次不想获取文档时都实例化ObjectId,这让我感觉很笨拙…
ObjectId
是mongo对_id的默认建议。在生成自己的唯一id时,您总是可以覆盖它,并在insert语句中为_id传递它。Meteor使用字符串代替ObjectId。您可以编写一个包装器,为您的插入呼叫传递一个唯一的_id字符串。谢谢您的回答。谢谢您的回答。问题是,我必须不断地将前端应用程序中的数字ID转换为mongo对象ID。因此,我必须始终使用新的对象ID(整数ID)。有没有办法解决这个问题?您可以对
\u id
字段使用哈希。我更新了答案,因为太长了,无法输入评论。不用担心。如果答案对你有帮助,请接受。谢谢你的回答。谢谢你的回答。问题是我必须不断转换数字ID,即