不好意思,我是MongoDB的新手。我正在收集树,其中一个是其他两个元素不重叠的超集。每个项目都由唯一的字符串ID区分。我想要的是获取其他两个集合中未包含的超集的项。您能为我提供一些有关如何有效执行此操作的提示吗?
谢谢。
编辑:
超集结构:
{ "_id" : 1, "str_id" : "ABC1fd3fsewer", "date": "a day" }
子集1的结构:{ "_id" : 1, "str_id" : "ABre1fd3fsewer", "description" : "product" }
子集2的结构:{ "_id" : 1, "str_id" : "ABC1fd3fsewfe"}
每个集合都有不同的结构,但都有一个共同的字段str_id
。
EDIT由@Neel建议改进 我有以下格式:
parent = [{'str_id':'a', 'tag1':'parent_random', 'tag2': 'parent_random', 'tag3':'parent_random'},{'str_id':'b',...},{'str_id':'c',...},{'str_id':'d',...}...]
child1 = [{'str_id':'a', 'tag2': child1_random'},{'str_id':'b', 'tag2': 'child1_random'}]
child2 = [{'str_id':'c', 'tag1':'child2_random'}]
我想要
outcome = [{'str_id':'c', 'tag1':'parent_random', 'tag2': 'parent_random', 'tag3':'parent_random'},{'str_id':'d', 'tag1':'parent_random', 'tag2': 'parent_random', 'tag3':'parent_random'}]
答案 0 :(得分:0)
听起来您需要汇总操作。
此文档可能会帮助您: Lookup in an array
您可以使用一个聚合操作进行多次查找,以便可以检查两个子集。
我将假设您正在使用REST API,并且客户端正在从超集集合发送对文档子集的请求。您可以从客户端的超集发送要检查的文档数组,然后:
1-将超集中的所有文档与您要发送的文档数组进行匹配
2-展开超集文档数组
3-在“ str_id”字段中查找子集集合并将其设置为“ subset_one_results”之类的字段。
4-对两个子集结果执行匹配操作,该操作将在“ subset_one_results”上返回一个空数组...例如,这将匹配子集1中包含的所有不的超集文档。
$match({ $and : { "subset_one_results" : { $eq : [] } }, { "subset_two_results" : { $eq : [] } } })
5-如果要将它们作为数组返回给客户端,则将它们分组到新数组中。
要提高操作性能,您必须确定发出此请求的频率。如果存在经常出现的风险,请确保在不是不是ObjectId字段的情况下,在该字段上创建一个索引。从您的代码中我无法确定您使用的是自定义字符串字段还是ObjectId,这就是为什么我要提出这一点。
我不知道您要使用什么来进行查询(纯MongoDB查询语言,驱动程序等),因此我不确定如何用代码来回答问题,因此描述了上面的步骤。