抱歉标题不好,想不出更好的标题。
我有一个父 Product,它有一个空的 ancestors 数组。
我也有 ancestors 的 Products 包含父级 _id ,称为 variants 和 Products ancestors包括父级和名为 options 的变体 _id。所有产品都在同一文档中,没有引用。
父产品
{
productType: 'simple'
ancestors: [],
title: "Test Title",
_id: "1"
}
变体产品
{
productType: 'variant'
ancestors: ["1"],
title: "Test Variant",
_id: "2"
}
可选产品
{
productType: 'option'
ancestors: ["1", "2"],
title: "Test Variant",
_id: "3"
}
当我搜索产品时,我想在搜索结果中包含所有 variants 和 options,例如:
products: [{
_id: "1",
variants: [{...}],
options: [{...}]
},
...
]
搜索端点
Product.aggregate([
{$match: {productType: 'simple'}},
{$match: {$or: [{sku: {$regex: new RegExp(makeComp(value), 'i')}}, {title: {$regex: new RegExp(makeComp(value), 'i')}}]}},
{
$project: {
_id : 1,
title : 1,
productType: 1,
ancestors: 1
}
},
], (err, result) => {
console.log(err);
console.log(result);
});
在 $project 之后我尝试了很多东西,但没有成功。
我必须在产品匹配后创建一个新的find 或aggregate 还是有办法获取一个aggregate?
最佳答案
您可以使用 $or 简单地执行 find
db.products.find({$expr : {
$or : [
{"_id":1},
{"productType" : "variant", "ancestors" : 1},
{"productType" : "option", "ancestors" : 1}
]
}})
与聚合相同
db.products.aggregate([
{$match: {$expr : {
$or : [
{"_id":1},
{"productType" : "variant", "ancestors" : 1},
{"productType" : "option", "ancestors" : 1}
]
}}}
])
EDIT-1
用$lookup获取结果
db.products.aggregate([
{$match: {"_id":"1"}},
{$lookup: {
from: "products",
let: {id : "$_id", productType: "$productType"},
pipeline:[{$match: {$expr: {$and: [{$in: ["$$id","$ancestors"]}, {$eq: ["$productType" ,"variant"]}]}}}],
as: "variants"
}},
{$lookup: {
from: "products",
let: {id : "$_id", productType: "$productType"},
pipeline:[{$match: {$expr: {$and: [{$in: ["$$id","$ancestors"]}, {$eq: ["$productType" ,"option"]}]}}}],
as: "options"
}}
]).pretty()
EDIT-2
使用 $match、$group 和 $project
db.products.aggregate([
{$match: {$expr : {
$or : [
{"_id":1},
{"productType" : "variant", "ancestors" : 1},
{"productType" : "option", "ancestors" : 1}
]
}}},
{$group: {_id: "$productType", docs : {$push : "$$ROOT"}}},
{$group: {_id: null, docs : {$push : "$docs"}}},
{$project: {
simple: {$arrayElemAt:[{$filter: {input : "$docs", as: "d", cond : {$in: ["simple", "$$d.productType"]}}},0]},
variant: {$arrayElemAt:[{$filter: {input : "$docs", as: "d", cond : {$in: ["variant", "$$d.productType"]}}},0]},
option: {$arrayElemAt:[{$filter: {input : "$docs", as: "d", cond : {$in: ["option", "$$d.productType"]}}},0]}
}}
]).pretty()
关于node.js - Mongoose 聚合,在产品匹配时找到产品的祖先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54504844/
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如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装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
我有一个驼峰式字符串,例如: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
我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'
我已经在mountainlion上成功安装了rbenv和rubybuild。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub
注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配
@raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://
前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立
基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于