在很多讲座之后,我不能说是否可以在 1 查询 中使用 mongo 执行这个 sql 等效查询:
SELECT * from collection WHERE _id NOT IN (SELECT blacklist from集合 WHERE _id = 1 )
我尝试了很多关于聚合的事情,但没有成功。
这是我的收藏:
{
"_id" : 1,
"blacklist" : [8,9,10,3]
"code_postal" : 67110,
"loc" : {
"type" : "Point",
"coordinates" : [
7.72,
48.91
]
}
}
{
"_id" : 2,
"blacklist" : [18,1,93]
"code_postal" : 67110,
"loc" : {
"type" : "Point",
"coordinates" : [
7.63,
48.91
]
}
}
{
"_id" : 3,
"blacklist" : [7,3]
"code_postal" : 67110,
"loc" : {
"type" : "Point",
"coordinates" : [
7.7,
48.96
]
}
}
此查询的预期结果和此集合应为(排除 _id 3,因为在 _id 1 的黑名单中):
{
"_id" : 1,
"blacklist" : [8,9,10,3]
"code_postal" : 67110,
"loc" : {
"type" : "Point",
"coordinates" : [
7.72,
48.91
]
}
}
{
"_id" : 2,
"blacklist" : [18,1,93]
"code_postal" : 67110,
"loc" : {
"type" : "Point",
"coordinates" : [
7.63,
48.91
]
}
}
问候
最佳答案
我认为你应该省去麻烦,只使用两个查询(首先,获取黑名单,然后查询文档)但如果真的没有其他方法:
db.so.aggregate([
{
// First, choose what fields to return (less is better)
// and only return a certain document {_id: 1}'s blacklist.
$project: {
_id: 1,
code_postal: 1,
loc: 1,
bl: {
// Only return blacklists if the parent has
// a certain ID.
$cond: {
if: {$eq: ["$_id", 1]}, // or a different value
then: "$blacklist",
else: 0
}
}
}
},
{
// Group all documents in one, so that we can embed the
// blacklist into all documents, not just in {_id:1}.
$group: {
_id: null, // Group everything.
items: { $push: "$$ROOT" },
blacklist: { $max: "$bl" } // "{}" is higher than "0".
// This makes sure that we only
// get one blacklist, not
// [ [], 0, 0, 0, ... ]
}
},
{
// Pull the documents apart again.
$unwind: "$items"
},
{
$project: {
_id: "$items._id",
code_postal: "$items.code_postal",
loc: "$items.loc",
whitelisted: {
// If everything in the following array is true,
// then the _id is not in the blacklist.
$allElementsTrue: [{
$map: {
// Iterate over $blacklist
input: "$blacklist",
as: "currentId",
in: {
// If the ids don't match, return true.
$ne: ["$$currentId", "$items._id"]
}
}
}]
}
}
},
{
// Only find non-blacklisted documents.
$match: {
"whitelisted": true
}
}
]);
请注意,由于这会将所有文档归为一个,因此您必须注意不要超过 Mongo's document size limits .
这会产生以下内容:
[
{
"_id" : 1,
"code_postal" : 67110,
"loc" : {
"type" : "Point",
"coordinates" : [
7.72,
48.91
]
},
"whitelisted" : true
},
{
"_id" : 2,
"code_postal" : 67110,
"loc" : {
"type" : "Point",
"coordinates" : [
7.63,
48.91
]
},
"whitelisted" : true
}
]
关于mongodb - 聚合子查询,在特定_id的列表中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27795488/
我正在用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.
是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论
我知道我可以指定某些字段来使用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
在读取/解析文件(使用Ruby)时忽略某些行的最佳方法是什么?我正在尝试仅解析Cucumber.feature文件中的场景,并希望跳过不以Scenario/Given/When/Then/And/But开头的行。下面的代码有效,但它很荒谬,所以我正在寻找一个聪明的解决方案:)File.open(file).each_linedo|line|line.chomp!nextifline.empty?nextifline.include?"#"nextifline.include?"Feature"nextifline.include?"Inorder"nextifline.include?
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我在搜索我的值是方法的散列时遇到问题。我只是不想运行plan_type与键匹配的方法。defmethod(plan_type,plan,user){foo:plan_is_foo(plan,user),bar:plan_is_bar(plan,user),waa:plan_is_waa(plan,user),har:plan_is_har(user)}[plan_type]end目前如果我传入“bar”作为plan_type,所有方法都会运行,我怎么能只运行plan_is_bar方法呢? 最佳答案 这个变体怎么样?defmethod
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration
我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试
我想获取主题名称与搜索关键字匹配的所有配置文件。现在我正在加载所有配置文件。我需要知道如何实现它。非常感谢任何帮助。配置文件.rbhas_many:categorizationshas_many:subjects,through::categorizations主题.rbhas_many:categorizationshas_many:profiles,through::categorizations分类.rbbelongs_to:profilebelongs_to:subjectviews/search/index.html.erb#searchform'get'do%>nil%>#