Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.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
MongoDB(PHP)-自定义;id";,和订单号_Php_Mongodb - Fatal编程技术网

MongoDB(PHP)-自定义;id";,和订单号

MongoDB(PHP)-自定义;id";,和订单号,php,mongodb,Php,Mongodb,首先我要说的是,我对MongoDb和面向文档的db一般来说都是新手 mongodb中的嵌入文档出现了一些问题(无法仅选择嵌套文档(例如博客文章中的单个注释)), 我重新设计了数据库。现在我有两个收藏,帖子和评论(不是真正的交易,为了方便起见使用博客示例) 示例-发布收集文档: 排列{ '_id' : MongoId, 'title' : 'Something', 'body' : 'Something awesome' '_id' : MongoId, 'postId

首先我要说的是,我对MongoDb和面向文档的db一般来说都是新手

mongodb中的嵌入文档出现了一些问题(无法仅选择嵌套文档(例如博客文章中的单个注释)), 我重新设计了数据库。现在我有两个收藏,帖子和评论(不是真正的交易,为了方便起见使用博客示例)

示例-发布收集文档:

排列{

'_id'   :  MongoId,

'title' : 'Something',

'body'  : 'Something awesome'   
'_id'    : MongoId,

'postId' : MongoId,

'userId' : MongoId,

'commentId' : 33,

'comment' : 'Punch the punch line!'
}

示例-评论文件:

排列{

'_id'   :  MongoId,

'title' : 'Something',

'body'  : 'Something awesome'   
'_id'    : MongoId,

'postId' : MongoId,

'userId' : MongoId,

'commentId' : 33,

'comment' : 'Punch the punch line!'
}

如您所见,我有多个注释文档(如我前面所说,我希望能够选择单个注释,而不是它们的数组)

我的计划是:我想使用postId和commentId从集合中选择单个注释(commentId仅在具有相同postId的注释中是唯一的值)。 Oh和commentId需要是一个int,这样我就可以使用该值来计算下一个和上一个文档,类似于“orderWith”数字

现在我可以得到这样的评论:

URI:mongo.php?post=4de526b67cdfa94f0f000000&comment=4

代码:$comment=$collection->findOne(数组(“postId”=>$theObjId,“commentId”=>(int)$commentId))

我有几个问题

  • 我做得对吗
  • 生成这种commentId的最佳方法是什么
  • 确保commentId在具有相同postId的评论中唯一的最佳方法是什么(upsert?)
  • 如何处理并发查询
  • 我做得对吗

    这是一个非常困难的问题。它有用吗?它是否满足您的性能需求,您是否愿意维护它

    MongoDB没有任何“规范化”或“唯一真实的方式”的概念。您以适合自己的方式对数据进行建模

    生成这种commentId的最佳方法是什么? 确保commentId在具有相同postId的评论中唯一的最佳方法是什么(upsert?)

    这确实是一个复杂的问题。如果要生成单调递增的整数ID(如自动递增),则需要一个中心权限来生成这些整数。这往往无法很好地扩展

    通常建议的方法是使用ObjectId/MongoId。这将给你一个唯一的ID

    但是,您确实需要一个整数。因此,请看一看。你可以在你的帖子上保留一个“last_comment_id”,然后在创建新评论时更新它

    如何处理并发查询

    为什么并发查询会成为一个问题?两个读卡器应该能够访问相同的数据


    您是否担心创建并发评论?然后查看查找修改文档。

    我不知道全局是否允许您执行此操作,但下面是我将如何执行此操作

    我会在每篇文章中都有一系列的评论。这意味着不需要联接。在您的情况下,注释的规范化不会带来任何好处。我将用
    CreatedAt
    替换
    CommentID
    ,作为创建时间


    这将使您有一个易于使用的数据模型,以及对其进行排序的能力。

    @Gates和@Earlz感谢您的帮助,但最后我将使用ref和MongoId。哇。。。我不知道评论有5分钟的编辑时间:(这是上一篇的其余部分。@盖茨和@Earlz感谢您的帮助,但最后我将使用ref和MongoId。Post文档将有一个MongoId数组,引用单独集合中的评论。Mongo的“自动递增”数组键将用作整数。有了它,我想我可以对上一个和下一个元素进行排序和选择。嗯,我不明白为什么要将注释存储在单独的集合中。这对于面向文档的(非关系型)来说没有任何意义这与mongodb概念背后的想法相矛盾。尤其是在你的帖子集合中通过一系列Mongoid来引用它们是没有任何意义的,因为它们会导致性能损失和可怕的维护狂欢。与其浪费精力在db的进一步重新设计上,不如提出建议e关于嵌入的“麻烦”的另一个问题。我相信有合适的解决方案…;@proximus我知道的最大问题之一是mongodb无法从常规文档中选择和返回一个嵌入的数组/文档;相反,我需要使用嵌入式数组获取整个文档,至少包含500个元素(顺便说一句,这些元素不是小的简单注释)。无论如何,从外观上看,我现在将使用mysql。至少在这可用之前。谢谢你的帮助:)@Marko也许我误解了你的关心。。。但是,单嵌入式数组/文档的检索不包括在本文中吗?例如。与帖子相关联的注释作为数组注释存储在post doc中,并且每个嵌套注释都包含一个唯一的键(例如,出于排序原因的ObjectId),您可以执行以下操作:
    db.posts.findOne({''u id':ObjectId('…'),'comments.id':ObjectId('…'),{comments:1})
    (注意{comments:1},等于PHP的
    MongoCollection::find()
    中的
    $fields
    param)