- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我发现了 Mongodb 及其使用管道的查询,我正在为一个案例而苦苦挣扎。
我正在寻找每个 pathsList 文档,我可以在其中找到从位置 B 到位置 C 的路径
假设我有 2 个来自 pathsListsCollection 的 pathsList 文档,它们有一组 path 文档
-------------
pathsList = {
_id: ObjectId(...),
pathIds: [path1Id, path2Id, path3Id]
}
-------------
path1 = {
_id: ObjectId(...),
positionStart: 8,
positionFinal: 10,
index:0
}
-------------
path2 = {
_id: ObjectId(...),
positionStart: 10,
positionFinal: 12,
index:1
}
-------------
path3 = {
_id: ObjectId(...),
positionStart: 12,
positionFinal: 14,
index:2
}
-------------
-------------
pathsList = {
_id: ObjectId(...),
pathIds: [path4Id, path5Id, path6Id]
}
-------------
path4 = {
_id: ObjectId(...),
positionStart: 14,
positionFinal: 12,
index:0
}
-------------
path5 = {
_id: ObjectId(...),
positionStart: 12,
positionFinal: 10,
index:1
}
-------------
path6 = {
_id: ObjectId(...),
positionStart: 10,
positionFinal: 8,
index:2
}
-------------
到目前为止,我已经做了这样的事情:
pathsListCollection.aggregate([
{
$lookup:{
from: "pathsCollection",
localField: "pathIds",
foreignField: "_id",
as: paths
}
},
{
$match:{
paths.positionStart : 10 // first input value
}
},
{
$match:{
paths.positionFinal : 12 // second input value
}
},
])
这样做我得到了 2 个 pathsList 文档。
现在,我如何更改此聚合以仅找到具有特定顺序的 positionStart = 10 和 positionFinal = 12 的聚合如何仅在第一个表达式已经验证时才尝试验证第二个表达式?
我研究了 $slice,试图在第一个 $match 之后对路径数组进行切片,并继续查询其余部分,但找不到任何相关的语法来执行此操作。
即:使用第一个 pathsList,我用 paths array 到达第一个 $match :
[{
_id: ObjectId(...),
positionStart: 8,
positionFinal: 10,
index:0
},
{
_id: ObjectId(...),
positionStart: 10, // first $match here
positionFinal: 12,
index:1
},
{
_id: ObjectId(...),
positionStart: 12,
positionFinal: 14,
index:2
}]
我想在这样的数组上进行下一个 $match :
[{
_id: ObjectId(...),
positionStart: 10,
positionFinal: 12, // second $match has to start from this elem of the array
index:1
},
{
_id: ObjectId(...),
positionStart: 12,
positionFinal: 14,
index:2
}]
这有可能吗?首先查询 pathsCollection 而不是 pathsListsCollection 会更容易吗?
但是,我愿意接受任何可以帮助我解决该问题的不同方法或想法提前致谢
最佳答案
如果我得到这个,那么你想根据给定的匹配 positionStart
和 positionFinish
在这里“切片”。
如果您确实在 "pathsCollection"
上开始查询,实际上性能会更好,因为这是您实际要匹配项目的地方。所以 $match
应该“首先”完成并使用 $or
在范围内“切片”的表达式:
然后用 $lookup
然后,您将只返回 "pathsListCollection"
项,使用“切片”数组格式化:
在您的数据的最小样本上,从“开始”10
到“完成”12
将是:
db.getCollection('pathsCollection').aggregate([
{ "$match": {
"positionStart": { "$gte": 10, "$lte": 12 },
"positionFinal": { "$gte": 10, "$lte": 12 }
}},
{ "$lookup": {
"from": "pathsListCollection",
"localField": "_id",
"foreignField": "pathIds",
"as": "pathsList"
}},
{ "$unwind": "$pathsList" },
{ "$addFields": {
"pathsList.pathIds": {
"$filter": {
"input": "$pathsList.pathIds",
"as": "p",
"cond": { "$eq": [ "$_id", "$$p" ] }
}
}
}},
{ "$unwind": "$pathsList.pathIds" },
{ "$group": {
"_id": "$pathsList._id",
"pathIds": {
"$push": {
"_id": "$_id",
"positionStart": "$positionStart",
"positionFinal": "$positionFinal",
"index": "$index"
}
}
}},
{ "$redact": {
"$cond": {
"if": {
"$and": [
{ "$eq": [
{ "$arrayElemAt": [
"$pathIds.positionStart",
0
]},
10
]},
{ "$eq": [
{ "$arrayElemAt": [
"$pathIds.positionFinal",
-1
]},
12
]}
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
会产生:
/* 1 */
{
"_id" : ObjectId("595db5d8f5f11516540d1185"),
"pathIds" : [
{
"_id" : ObjectId("595db4c7f5f11516540d1183"),
"positionStart" : 10.0,
"positionFinal" : 12.0,
"index" : 1.0
}
]
}
并且将“范围”缩小到“开始”10
和“完成”14
,这将是:
db.getCollection('pathsCollection').aggregate([
{ "$match": {
"positionStart": { "$gte": 10, "$lte": 14 },
"positionFinal": { "$gte": 10, "$lte": 14 }
}},
{ "$lookup": {
"from": "pathsListCollection",
"localField": "_id",
"foreignField": "pathIds",
"as": "pathsList"
}},
{ "$unwind": "$pathsList" },
{ "$addFields": {
"pathsList.pathIds": {
"$filter": {
"input": "$pathsList.pathIds",
"as": "p",
"cond": { "$eq": [ "$_id", "$$p" ] }
}
}
}},
{ "$unwind": "$pathsList.pathIds" },
{ "$group": {
"_id": "$pathsList._id",
"pathIds": {
"$push": {
"_id": "$_id",
"positionStart": "$positionStart",
"positionFinal": "$positionFinal",
"index": "$index"
}
}
}},
{ "$redact": {
"$cond": {
"if": {
"$and": [
{ "$eq": [
{ "$arrayElemAt": [
"$pathIds.positionStart",
0
]},
10
]},
{ "$eq": [
{ "$arrayElemAt": [
"$pathIds.positionFinal",
-1
]},
14
]}
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
制作:
/* 1 */
{
"_id" : ObjectId("595db5d8f5f11516540d1185"),
"pathIds" : [
{
"_id" : ObjectId("595db4c7f5f11516540d1183"),
"positionStart" : 10.0,
"positionFinal" : 12.0,
"index" : 1.0
},
{
"_id" : ObjectId("595db4c7f5f11516540d1184"),
"positionStart" : 12.0,
"positionFinal" : 14.0,
"index" : 2.0
}
]
}
它的语法可能看起来有点短,但它可能不是性能最好的选项,因为您不能在相反的情况下“查询”“pathsCollection”
,直到 $lookup
。实际执行:
db.pathsListCollection.aggregate([
{ "$lookup": {
"from": "pathsCollection",
"localField": "pathIds",
"foreignField": "_id",
"as": "pathIds"
}},
{ "$unwind": "$pathIds" },
{ "$match": {
"pathIds.positionStart": { "$gte": 10, "$lte": 14 },
"pathIds.positionFinal": { "$gte": 10, "$lte": 14 }
}},
{ "$group": {
"_id": "$_id",
"pathIds": { "$push": "$pathIds" }
}},
{ "$redact": {
"$cond": {
"if": {
"$and": [
{ "$eq": [
{ "$arrayElemAt": [
"$pathIds.positionStart",
0
]},
10
]},
{ "$eq": [
{ "$arrayElemAt": [
"$pathIds.positionFinal",
-1
]},
14
]}
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
这是关于 MongoDB 如何实际发布 $lookup
的“反向案例”的最佳形式。当应用于服务器时,可以在“解释”输出中看到:
{
"$lookup" : {
"from" : "pathsCollection",
"as" : "pathIds",
"localField" : "pathIds",
"foreignField" : "_id",
"unwinding" : {
"preserveNullAndEmptyArrays" : false
},
"matching" : {
"$and" : [
{
"positionStart" : {
"$gte" : 10.0
}
},
{
"positionStart" : {
"$lte" : 14.0
}
},
{
"positionFinal" : {
"$gte" : 10.0
}
},
{
"positionFinal" : {
"$lte" : 14.0
}
}
]
}
}
},
{
"$group" : {
在那里显示 $unwind
和 $match
已经“神奇地”消失了。他们现在当然已经“卷起”到 $lookup
中了。这样当查询相关数据时,你实际上只会那些符合给定条件的结果。
“非最佳”方法是 $filter
反而。但实际上来自相关集合的 ALL 结果被返回,然后只有在“完整”数组已经存在时才被删除:
db.pathsListCollection.aggregate([
{ "$lookup": {
"from": "pathsCollection",
"localField": "pathIds",
"foreignField": "_id",
"as": "pathIds"
}},
{ "$addFields": {
"pathIds": {
"$filter": {
"input": "$pathIds",
"as": "p",
"cond": {
"$and": [
{ "$gte": [ "$$p.positionStart", 10 ] },
{ "$lte": [ "$$p.positionStart", 14 ] },
{ "$gte": [ "$$p.positionFinal", 10 ] },
{ "$lte": [ "$$p.positionFinal", 14 ] },
]
}
}
}
}},
{ "$match": {
"pathIds": {
"$elemMatch": {
"positionStart": { "$gte": 10, "$lte": 14 },
"positionFinal": { "$gte": 10, "$lte": 14 }
}
}
}},
{ "$redact": {
"$cond": {
"if": {
"$and": [
{ "$eq": [
{ "$arrayElemAt": [
"$pathIds.positionStart",
0
]},
10
]},
{ "$eq": [
{ "$arrayElemAt": [
"$pathIds.positionFinal",
-1
]},
14
]}
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
还注意到您仍然需要 $match
或 $redact
鉴于在这种情况下生成的数组条目仍然满足条件,并且由于 $filter
的结果,数组实际上不是“空”的.
路径集合
/* 1 */
{
"_id" : ObjectId("595db4c7f5f11516540d1182"),
"positionStart" : 8.0,
"positionFinal" : 10.0,
"index" : 0.0
}
/* 2 */
{
"_id" : ObjectId("595db4c7f5f11516540d1183"),
"positionStart" : 10.0,
"positionFinal" : 12.0,
"index" : 1.0
}
/* 3 */
{
"_id" : ObjectId("595db4c7f5f11516540d1184"),
"positionStart" : 12.0,
"positionFinal" : 14.0,
"index" : 2.0
}
/* 4 */
{
"_id" : ObjectId("595db616f5f11516540d1186"),
"positionStart" : 14.0,
"positionFinal" : 12.0,
"index" : 0.0
}
/* 5 */
{
"_id" : ObjectId("595db616f5f11516540d1187"),
"positionStart" : 12.0,
"positionFinal" : 10.0,
"index" : 1.0
}
/* 6 */
{
"_id" : ObjectId("595db616f5f11516540d1188"),
"positionStart" : 10.0,
"positionFinal" : 8.0,
"index" : 2.0
}
路径列表集合
/* 1 */
{
"_id" : ObjectId("595db5d8f5f11516540d1185"),
"pathIds" : [
ObjectId("595db4c7f5f11516540d1182"),
ObjectId("595db4c7f5f11516540d1183"),
ObjectId("595db4c7f5f11516540d1184")
]
}
/* 2 */
{
"_id" : ObjectId("595db62df5f11516540d1189"),
"pathIds" : [
ObjectId("595db616f5f11516540d1186"),
ObjectId("595db616f5f11516540d1187"),
ObjectId("595db616f5f11516540d1188")
]
}
关于mongodb - 使用 $lookup 根据匹配条件对数组进行切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44917069/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!