Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
Database 解析服务器,MongoDB-get";“喜欢”;物体的状态_Database_Mongodb_Parse Platform_Mongodb Query_Parse Server - Fatal编程技术网

Database 解析服务器,MongoDB-get";“喜欢”;物体的状态

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,但这似乎不是一个好主意,因为一条注释上可能有数

我使用的是在MongoDB上运行的解析服务器

假设我有集合
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的所有评论
  • 第二个查询再次针对on
    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解决方案将是最好的:)