MongoDB(PHP)-自定义;id";,和订单号
首先我要说的是,我对MongoDb和面向文档的db一般来说都是新手 mongodb中的嵌入文档出现了一些问题(无法仅选择嵌套文档(例如博客文章中的单个注释)), 我重新设计了数据库。现在我有两个收藏,帖子和评论(不是真正的交易,为了方便起见使用博客示例) 示例-发布收集文档: 排列{MongoDB(PHP)-自定义;id";,和订单号,php,mongodb,Php,Mongodb,首先我要说的是,我对MongoDb和面向文档的db一般来说都是新手 mongodb中的嵌入文档出现了一些问题(无法仅选择嵌套文档(例如博客文章中的单个注释)), 我重新设计了数据库。现在我有两个收藏,帖子和评论(不是真正的交易,为了方便起见使用博客示例) 示例-发布收集文档: 排列{ '_id' : MongoId, 'title' : 'Something', 'body' : 'Something awesome' '_id' : MongoId, 'postId
'_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))
我有几个问题
您是否担心创建并发评论?然后查看查找修改文档。我不知道全局是否允许您执行此操作,但下面是我将如何执行此操作 我会在每篇文章中都有一系列的评论。这意味着不需要联接。在您的情况下,注释的规范化不会带来任何好处。我将用
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)