我将部分 SQL 数据传递给 MongoDB 以提高密集查询的效率。我已经阅读了来自 mongo 的文档,但我仍在努力实现一个查询。
我有一个与客户的集合,其中有他们所有产品的 list 。我试图搜索谁购买了某种药物超过 4 次,但我不知道如何获得该信息,因为它是一个数组,在一个数组内,而我的 mongo knowladge atm 非常有限。
{
"_id" : ObjectId("5c3c71f2760c4f47c701fe14"),
"email" : "jcc@gmail.pt",
"faturas" : [
{
"pontos_r" : NumberLong(25),
"id_c" : NumberLong(1),
"data_f" : ISODate("2017-12-10T08:41:01Z"),
"pontos_u" : NumberLong(0),
"medicamentos" : [
{
"categoria" : "Analg�sico",
"receita" : "N",
"des" : "Ben-U-Ron 500",
"qt" : 20,
"formato" : "granulado",
"qt_v" : NumberLong(2),
"pos" : "A12",
"lab" : "Laborat�rio do Rio Ave",
"preco_l" : 5.02,
"un" : "un",
"preco" : 2.51,
"preco_v" : 2.51,
"id" : NumberLong(1),
"stock" : NumberLong(21)
},
{
"categoria" : "Estatina",
"receita" : "S",
"des" : "Sinvastatina",
"qt" : 30,
"formato" : "comprimido",
"qt_v" : NumberLong(1),
"pos" : "K23",
"lab" : "Mylan",
"preco_l" : 16.45,
"un" : "un",
"preco" : 16.45,
"preco_v" : 16.45,
"id" : NumberLong(6),
"stock" : NumberLong(25)
}
],
"data_s" : ISODate("2017-12-10T08:07:00Z"),
"funcionario" : {
"tlmv" : "910851961",
"nome" : "Mariana Pereira Fernandes",
"ordenado" : 750.27,
"iban" : "PT 50 2732 5162 12345678909",
"pass" : "608e01334f5575f10813efa40ce0102f2dc0a75e",
"niss" : "12345678909",
"id" : NumberLong(1),
"cedula" : "12345"
},
"id_func" : NumberLong(1),
"total" : 21.47,
"id" : NumberLong(3),
"desconto" : 0
},
{
"pontos_r" : NumberLong(0),
"id_c" : NumberLong(1),
"data_f" : ISODate("2018-01-31T19:59:04Z"),
"pontos_u" : NumberLong(0),
"medicamentos" : [
{
"categoria" : "Estatina",
"receita" : "S",
"des" : "Sinvastatina",
"qt" : 30,
"formato" : "comprimido",
"qt_v" : NumberLong(1),
"pos" : "K23",
"lab" : "Mylan",
"preco_l" : 16.45,
"un" : "un",
"preco" : 16.45,
"preco_v" : 16.45,
"id" : NumberLong(6),
"stock" : NumberLong(25)
}
],
"data_s" : ISODate("2018-01-31T19:45:29Z"),
"funcionario" : {
"tlmv" : "963789245",
"nome" : "Jos� Pedro Milhazes Carvalho Pinto",
"ordenado" : 800.62,
"iban" : "PT 50 6227 3251 87637898710",
"pass" : "679951a24ba997db7355e6b63d66ea51c4a1a5ba",
"niss" : "18746783601",
"id" : NumberLong(4),
"cedula" : "76912"
},
"id_func" : NumberLong(4),
"total" : 16.45,
"id" : NumberLong(7),
"desconto" : 0
},
{
"pontos_r" : NumberLong(10),
"id_c" : NumberLong(1),
"data_f" : ISODate("2018-02-16T11:59:01Z"),
"pontos_u" : NumberLong(0),
"medicamentos" : [
{
"categoria" : "Estatina",
"receita" : "S",
"des" : "Sinvastatina",
"qt" : 30,
"formato" : "comprimido",
"qt_v" : NumberLong(1),
"pos" : "K23",
"lab" : "Mylan",
"preco_l" : 16.45,
"un" : "un",
"preco" : 16.45,
"preco_v" : 16.45,
"id" : NumberLong(6),
"stock" : NumberLong(25)
}
],
"data_s" : ISODate("2018-02-16T11:53:29Z"),
"funcionario" : {
"tlmv" : "963789245",
"nome" : "Jos� Pedro Milhazes Carvalho Pinto",
"ordenado" : 800.62,
"iban" : "PT 50 6227 3251 87637898710",
"pass" : "679951a24ba997db7355e6b63d66ea51c4a1a5ba",
"niss" : "18746783601",
"id" : NumberLong(4),
"cedula" : "76912"
},
"id_func" : NumberLong(4),
"total" : 16.45,
"id" : NumberLong(9),
"desconto" : 0
},
{
"pontos_r" : NumberLong(25),
"id_c" : NumberLong(1),
"data_f" : ISODate("2018-03-13T13:54:39Z"),
"pontos_u" : NumberLong(0),
"medicamentos" : [
{
"categoria" : "Antibi�tico",
"receita" : "S",
"des" : "Cefotaxima",
"qt" : 20,
"formato" : "comprimido",
"qt_v" : NumberLong(1),
"pos" : "D26",
"lab" : "Laborat�rio Ahrro",
"preco_l" : 8.51,
"un" : "un",
"preco" : 8.51,
"preco_v" : 8.51,
"id" : NumberLong(4),
"stock" : NumberLong(22)
},
{
"categoria" : "Estatina",
"receita" : "S",
"des" : "Sinvastatina",
"qt" : 30,
"formato" : "comprimido",
"qt_v" : NumberLong(1),
"pos" : "K23",
"lab" : "Mylan",
"preco_l" : 16.45,
"un" : "un",
"preco" : 16.45,
"preco_v" : 16.45,
"id" : NumberLong(6),
"stock" : NumberLong(25)
}
],
"data_s" : ISODate("2018-03-13T13:50:42Z"),
"funcionario" : {
"tlmv" : "963789245",
"nome" : "Jos� Pedro Milhazes Carvalho Pinto",
"ordenado" : 800.62,
"iban" : "PT 50 6227 3251 87637898710",
"pass" : "679951a24ba997db7355e6b63d66ea51c4a1a5ba",
"niss" : "18746783601",
"id" : NumberLong(4),
"cedula" : "76912"
},
"id_func" : NumberLong(4),
"total" : 24.96,
"id" : NumberLong(11),
"desconto" : 0
},
{
"pontos_r" : NumberLong(10),
"id_c" : NumberLong(1),
"data_f" : ISODate("2018-04-05T23:21:53Z"),
"pontos_u" : NumberLong(0),
"medicamentos" : [
{
"categoria" : "Estatina",
"receita" : "S",
"des" : "Sinvastatina",
"qt" : 30,
"formato" : "comprimido",
"qt_v" : NumberLong(1),
"pos" : "K23",
"lab" : "Mylan",
"preco_l" : 16.45,
"un" : "un",
"preco" : 16.45,
"preco_v" : 16.45,
"id" : NumberLong(6),
"stock" : NumberLong(25)
}
],
"data_s" : ISODate("2018-04-05T22:59:23Z"),
"funcionario" : {
"tlmv" : "934567123",
"nome" : "Pedro Jorge Rito Lima",
"ordenado" : 800.32,
"iban" : "PT 50 2751 3262 76598707612",
"pass" : "3cfa1c281281ffe4f5db2ccfbe7a17f8a9479808",
"niss" : "14385639201",
"id" : NumberLong(2),
"cedula" : "54321"
},
"id_func" : NumberLong(2),
"total" : 16.45,
"id" : NumberLong(13),
"desconto" : 0
}
],
"id" : NumberLong(1),
"nif" : "123456789",
"nome" : "Jo�o da Costa e Campos",
"pass" : "d1925c0ef3f6c8c16ab291510383617148a53979",
"pontos" : NumberLong(0),
"tlmv" : "912345678"
} 这是仅来自一位客户的 json 文件,我如何从他的所有产品中总结出某种药物 - “medicamenos.des”?在这种情况下,如果我搜索“Sinvastatina”,它将是肯定的,因为它计数了 5 次。我的预期结果类似于“客户姓名:---”“药品名称---”“计数---”。 谢谢你的时间
最佳答案
您可以尝试以下聚合:
db.col.aggregate([
{
$unwind: "$faturas"
},
{
$unwind: "$faturas.medicamentos"
},
{
$group: {
_id: {
medicine: "$faturas.medicamentos.des",
client: "$email"
},
count: { $sum: 1 }
}
},
{
$match: {
count: { $gte: 4 }
}
},
{
$project: {
_id: 0,
clientName: "$_id.client",
medicineName: "$_id.medicine",
count: 1
}
}
])
哪些输出:
{ "count" : 5, "clientName" : "jcc@gmail.pt", "medicineName" : "Sinvastatina" }
关键是您需要在 $group 中包含 medicine 和 client -ing 条件。然后您可以使用 $project 重命名该字段。另外你需要 $match检查计数是否为 $gte 4.
关于mongodb - 搜索数组信息的总和值 - MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54185116/
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>