我有一个 MongoDB,其中包含一组文档,如下所示:
{
_id: ObjectId("5222769532fed3037d000049"),
cat_list: { "52226a8932fed36c3000007e": 1 },
feature_list: {
"52227433abb03fa34b0000fa": 0.2,
"52236117099c8924c500004a": 0.2,
"52236236c71890c199000054": 0.2,
"522374d2842e497d2c00000c": 0.2,
"52237e3b842e493760000021": 0.2 },
title: "blah"
现在我基本上想找到与提供给 feature_list 中的键的一组键相匹配的文档。为此,我想我将使用某种形式的 $in [,],但我不确定如何使用键:值列表来实现。 (是一样的吗?)
其次,我想按频率降序对结果进行排序(如果我可以在 mongodb 中执行此操作而不必在我的服务器端代码中执行)。因此,如果我正在查询 "52227433abb03fa34b0000fa"OR "52236117099c8924c500004a"OR "52236236c71890c199000054",我的结果集将包含所有具有 feature_list 的文档,其中包含 OR 列表和文档中的一个或多个匹配次数最多的将排在第一位,然后是频率次之,依此类推。
最佳答案
要查找所有这些文档中至少有一个字段具有给定值,您可以使用此查询:
db.aggr.find({$or: [
{ "feature_list.52227433abb03fa34b0000fa" : { $exists: true } },
{ "feature_list.52236117099c8924c500004a" : { $exists: true } },
{ "feature_list.52236236c71890c199000054" : { $exists: true } }
]});
找到您的文档:
{
"_id" : ObjectId("5222769532fed3037d000049"),
"cat_list" : {
"52226a8932fed36c3000007e" : 1
},
"feature_list" : {
"52227433abb03fa34b0000fa" : 0.2,
"52236117099c8924c500004a" : 0.2,
"52236236c71890c199000054" : 0.2,
"522374d2842e497d2c00000c" : 0.2,
"52237e3b842e493760000021" : 0.2
},
"title" : "blah"
}
但是您不能真正按照您想要的方式对其进行排序,因为没有可排序的内容。我正在考虑按所有这些搜索字段进行排序,如果您只搜索一个字段,它会起作用,因为缺少的字段会有 lowest value .但是,在这种具有多个字段的情况下,sort 中字段的顺序很重要,这个技巧不起作用。
尝试按整个子文档进行排序也不起作用,即 .sort({"feature_list": -1}) 因为它没有提供任何有意义的排序。
所以此时获得这些结果的唯一方法是使用聚合框架、多个查询(例如 3 个),或者在您的代码中执行。
我很确定我可以编写聚合框架查询来执行此操作,但首先您将受到单个文档大小 (32Mb) 中可以容纳的结果数量的限制。如果你只返回 ids 那么它会好一点。其次,它可能实际上并没有那么有效。最后,您可能需要考虑重新设计架构,因为它有点不合常规。这样的查询变得困难且效率低下。
编辑
可以像这样重新设计模式:
{ ...,
feature_list: [
{fid: "52227433abb03fa34b0000fa", weight: 0.2},
{fid: "52236117099c8924c500004a", weight: 0.2}
]
}
这仍然无助于使用常规查询进行排序,但是查找数据会快得多,因为 Mongo 不会为 $exists 使用索引,但会在这个新的索引中使用索引(如果存在)字段成为数据的模式。在 Mongo 中无法按数组中匹配元素的数量进行排序。
您可以使用聚合框架而不是常规查询来获取数据,其方式非常类似于: In MongoDB search in an array and sort by number of matches 问题是你只能得到尽可能多的结果可以放在一个带有聚合框架的文档中。为了充分利用它,您可以在最后的步骤中仅转换文档的 _id。
使用聚合框架的替代方法是在找到结果后在代码中对数据进行排序。在任何一种情况下,由于索引,模式重新设计似乎都是有益的。
关于mongodb - 按匹配元素数量的顺序查询 MongoDB 中数组中包含的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21211576/
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用
我已经在mountainlion上成功安装了rbenv和rubybuild。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决