我是 MongoDB 和 NoSQL 的新手,我正在尝试(在相当有限的时间内)了解它是否可以完成我们已经将数据作为 json 文件的快速演示项目的工作。 我正在尝试使用 Mongo 测试不同的查询场景,但有一种场景让我卡住了。 想象一下,我有 3 个 mongodb 集合,代表具有类别和子类别的产品。每个项目可能有很多类别,每个类别可能有很多子类别。 这是一个简单的数据示例:
产品
{ "id" : "1", "name" : "product1", "categories": ["cat1_id", "cat2_id"] }
{ "id" : "2", "name" : "product2", "categories": ["cat1_id"]}
{ "id" : "3", "name" : "product3", "categories": ["cat3_id"}
类别
{ "id" : "cat1_id", "name" : "cat1", "sub_categories": ["subcat1_id", "scat2_id"]}
{ "id" : "cat2_id", "name" : "cat2", "sub_categories": ["subcat3_id"]}
{ "id" : "cat3_id", "name" : "cat3", "sub_categories": ["subcat1_id"]}
子类别
{ "id" : "subcat1_id", "name" : "sub cat1"}
{ "id" : "subcat2_id", "name" : "sub cat2"}
{ "id" : "subcat3_id", "name" : "sub cat3"}
我正在尝试查找 3 个集合,以便将类别和子类别的数据获取到产品文档中:
{
"id" : "1",
"name" : "product1",
"categories": [{
"id": "cat1_id",
"name": "cat1",
"sub_categories": [
{ "id" : "subcat1_id", "name" : "sub cat1"}
{ "id" : "subcat2_id", "name" : "sub cat2"}
]
}, {
"id": "cat2_id",
"name": "cat2",
"sub_categories": [
{ "id" : "subcat1_id", "name" : "sub cat1"}
]
}]
}
我正在执行 2 次查找并尝试使用 unwind 的多个选项,但如果产品有 2 个类别,我总是只获取第一个类别的子类别详细信息 - 第二个类别的子类别的详细信息已经消失并且即使对于类别 2,我也会得到类别 1 的子类别。
这是查询和我得到的结果:
查询:
db.product.aggregate([
$lookup: {
from: "category",
localField: "categories",
foreignField: "id",
as: "categories_obj"
},
$unwind: "categories",
$unwind: "categories_obj.sub_categories",
$lookup: {
from: "sub_category",
localField: "categories_obj.sub_categories",
foreignField: "id",
as: "sub_category_obj"
}
])
结果:
{
"id" : "1",
"name" : "product1",
"categories": "cat1_id"
"categories_obj" : [
{ "id" : "cat1_id", "name" : "cat1", "sub_categories": ["subcat1_id",
"scat2_id"]}
{ "id" : "cat2_id", "name" : "cat2", "sub_categories": ["subcat3_id"]}
],
"sub_category_obj": [
{ "id" : "subcat1_id", "name" : "sub cat1"}
{ "id" : "subcat2_id", "name" : "sub cat2"}
]
}
{
"id" : "1",
"name" : "product1",
"categories": "cat2_id"
"categories_obj" : [
{ "id" : "cat1_id", "name" : "cat1", "sub_categories": ["subcat1_id",
"scat2_id"]}
{ "id" : "cat2_id", "name" : "cat2", "sub_categories": ["subcat3_id"]}
],
"sub_category_obj": [
{ "id" : "subcat1_id", "name" : "sub cat1"}
{ "id" : "subcat2_id", "name" : "sub cat2"}
]
}
从结果可以看出,cat1和cat2都显示了子类1和2(属于cat1)的详细信息,但是子类3(属于cat2)缺失了。
一旦我能够获取所有子类别的详细信息,我将尝试 $group、$project 等来获取上述所需的数据格式,但我不知道如何获取所有子类别的详细信息.
请在这件事上给予我帮助。我希望 MongoDB 可以实现。
能够以所述格式获取数据的查询也将受到欢迎!
谢谢!
最佳答案
您可以在 mongodb 3.6 及更高版本中使用以下聚合
Project.aggregate([
{ "$lookup": {
"from": Category.collection.name,
"let": { "categories": "$categories" },
"pipeline": [
{ "$match": { "$expr": { "$in": [ "$_id", "$$categories" ] } } },
{ "$lookup": {
"from": SubCategory.collection.name,
"let": { "sub_categories": "$sub_categories" },
"pipeline": [
{ "$match": { "$expr": { "$in": [ "$_id", "$$sub_categories" ] } } }
],
"as": "sub_categories"
}}
],
"as": "categories"
}}
])
关于arrays - $lookup 两层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54388503/
我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]
通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复
我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试
给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at
我正在尝试循环哈希数组。当我到达获取枚举器开始循环的位置时,出现以下错误:undefinedmethod`[]'fornil:NilClass我的代码如下所示:defextraireAttributs(attributsParam)classeTrouvee=falsescanTrouve=falseownerOSTrouve=falseownerAppTrouve=falseresultat=Hash.new(0)attributs=Array(attributsParam)attributs.eachdo|attribut|#CRASHESHERE!!!typeAttribut=a
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta
我已经有很多两个值数组,例如下面的例子ary=[[1,2],[2,3],[1,3],[4,5],[5,6],[4,7],[7,8],[4,8]]我想把它们分组到[1,2,3],[4,5],[5,6],[4,7,8]因为意思是1和2有关系,2和3有关系,1和3有关系,所以1,2,3都有关系我如何通过ruby库或任何算法来做到这一点? 最佳答案 这是基本Bron–Kerboschalgorithm的Ruby实现:classGraphdefinitialize(edges)@edges=edgesenddeffind_maximum_