Database 解析服务器,MongoDB-get";“喜欢”;物体的状态
我使用的是在MongoDB上运行的解析服务器 假设我有集合Database 解析服务器,MongoDB-get";“喜欢”;物体的状态,database,mongodb,parse-platform,mongodb-query,parse-server,Database,Mongodb,Parse Platform,Mongodb Query,Parse Server,我使用的是在MongoDB上运行的解析服务器 假设我有集合User和Comment以及一个User和Comment的连接表。 用户可以喜欢注释,它在联接表中创建新记录 特别是在Parse Server中,可以使用集合中的“关系”字段定义联接表 现在,当我想要检索所有评论时,我还需要知道当前用户是否喜欢它们中的每一条。如何在不进行其他查询的情况下执行此操作? 您可能会说我可以在Comment表中创建一个数组字段likers,并使用$elemMatch,但这似乎不是一个好主意,因为一条注释上可能有数
User
和Comment
以及一个User和Comment的连接表。
用户可以喜欢注释,它在联接表中创建新记录
特别是在Parse Server中,可以使用集合中的“关系”字段定义联接表
现在,当我想要检索所有评论时,我还需要知道当前用户是否喜欢它们中的每一条。如何在不进行其他查询的情况下执行此操作?
您可能会说我可以在Comment
表中创建一个数组字段likers
,并使用$elemMatch
,但这似乎不是一个好主意,因为一条注释上可能有数千个likers
我的想法,但我希望有更好的解决方案:
我可以在Comment
表中创建数组字段someLikers
、关系(联接表)字段allLikers
和数字字段likecount
。然后在someLikers
和allLikers
中放入前100个likers,在allLikers
中只放入额外的likers。我总是增加的值,比如count
然后,当查询注释列表时,我将使用$elemMatch
实现调用,这将告诉我当前用户是否在someLikers
中。当我收到评论时,我会检查一些评论是否有likesCount>100
和$elemMatch
返回空值。如果是这样的话,我将不得不在join表中运行另一个查询,查找那些注释并检查(按查询)当前用户是否喜欢它们
有更好的选择吗?
谢谢 连接集合并不是一种真正的noSQL思维方式;-) 我不知道ParseServer,所以下面是基于纯MongoDB的 我要做的是,在注释文档中,为每个喜欢注释的用户使用ObjectId数组
db.Comment.aggregate(
[
{
$match: {
_id : ObjectId("your commentId")
}
},
{
$project: {
_id : 1,
name :1,
number_of_likes : {$size : "$liked"},
user_liked: {
$gt: [{
$size: {
$filter: {
input: "$liked",
as: "like",
cond: {
$eq: ["$$like", ObjectId("your userId")]
}
}
}
}, 0]
},
}
},
]
);
示例文档布局
{
"_id" : ObjectId(""),
"name" : "Comment X",
"liked" : [
ObjectId(""),
....
]
}
然后使用聚合来获取数据。我想你有评论的_id,你知道用户的_id
下面的聚合返回带有like计数和布尔值的注释,表示用户喜欢该注释
db.Comment.aggregate(
[
{
$match: {
_id : ObjectId("your commentId")
}
},
{
$project: {
_id : 1,
name :1,
number_of_likes : {$size : "$liked"},
user_liked: {
$gt: [{
$size: {
$filter: {
input: "$liked",
as: "like",
cond: {
$eq: ["$$like", ObjectId("your userId")]
}
}
}
}, 0]
},
}
},
]
);
这是回报
{
"_id" : ObjectId(""),
"name" : "Comment X",
"number_of_likes" : NumberInt(7),
"user_liked" : true
}
希望这是您的目标。我建议agains直接访问MongoDB,除非您必须这样做;毕竟,集合和关系的构建方式是解析的一个实现细节,从理论上讲,将来可能会发生变化,破坏您的代码 尽管您希望避免多个查询,但我建议您这样做(根据您的平台,您甚至可以并行运行两个解析查询):
Comment
的查询,用于获取所有要显示的注释;假设您有某种可以编写评论的Post
,查询将找到引用当前Post的所有评论Comment
,但这次是
- 受限于第一次查询中检索到的注释,例如:
containedIn(“objectID”,ArrayOfcommentId)
- 并且受限于当前用户在其
关系中的注释,例如:likers
equalTo(“likers”,currentUser)
你不需要创建连接表,不管怎样,你需要在fly上创建关系和统计数据等看起来你正在使用MongoDB的API($elemMatch)来查询你的数据。。。你不使用解析查询有什么原因吗?@dr_barto,因为我需要知道,在Find query中,用户是否在likers数组中,而不选择整个数组。Parse似乎不支持这一点,但我还没有尝试用MongoAPI实现它,这只是一个想法。“如果您使用PHP在后端运行查询,$elemMatch运算符限制查询的内容($elemMatch看起来像这样)?你为什么要拉所有的评论?我想你会想实现某种分页/限制,不是吗?无论你使用什么解决方案,一次拉所有评论的想法都无法很好地扩展。你能解释一下需要你拉用户喜欢的所有评论的用例吗?谢谢你Hoewmeister。正如我写的那样在问题中,“您可能会说我可以在注释表中创建一个数组字段likers。。。但这似乎不是一个好主意,因为一条评论上可能会有成千上万的喜欢。" ... 你认为将喜欢的人存储在数组中实际上是个好主意吗?每个db对象可能都有一些大小限制,对吗?我担心假设,如果用户给出几千条喜欢的评论,它就会崩溃。@DavidRiha抱歉错过了。文档限制为16MB!但在达到该限制之前,可以将大量objectid存储在一个数组中。当您担心您的文档大小超过16MB时,可以考虑一些解决方案。干杯@DavidRiha您可以研究的一个潜在解决方案是使用“延续”文档。如果您有《MongoDB权威指南》一书,请查看关于非规范化的章节“Will Wheathon效应”。如果你有任何问题,请告诉我!现在接受,因为在解析服务器中直接访问mongodb确实非常复杂。但我仍然认为,将来在Parse Server中实现$elemMatch或$lookup解决方案将是最好的:)