gpt4 book ai didi

mongodb - 匹配包含 $gte $lte 中所有数组元素的文档

转载 作者:可可西里 更新时间:2023-11-01 09:35:11 26 4
gpt4 key购买 nike

这是我的示例文档:

{
updated: [
1461062102,
1461062316
],
name: "test1",
etc: "etc"
}

{
updated: [
1460965492,
1461060275
],
name: "test2",
etc: "etc"
}


{
updated: [
1461084505
],
name: "test3",
etc: "etc"
}

{
updated: [
1461060430
],
name: "test4",
etc: "etc"
}

{
updated: [
1460965715,
1461060998
],
name: "test5",
etc: "etc"
}

查找查询在 $gte$lte 条件下获取所有匹配更新日期的文档的正确用法是什么?

例如

db.test.find({'updated':{$elemMatch:{$gte:1461013201,$lte:1461099599}}})

我可以使用 $or 并将其设置为 updated.0:{$gte:1461013201,$lte:1461099599}, update.1:{$gte:1461013201,$ lte:1461099599} 等但是如果我的数组将包含更多更新日期怎么办?

据我所知,$elemMatch 不符合我的标准,因为它只匹配数组中的第一次出现。

最佳答案

好问题。你在正确的轨道上 $elemMatch ,但这确实采用了标准运算符中未涵盖的其他逻辑。

所以你要么用$redact :

db.test.aggregate([
{ "$match": {
'updated': { '$elemMatch':{ '$gte':1461013201, '$lte':1461099599 } }
}},
{ "$redact": {
"$cond": {
"if": {
"$allElementsTrue": {
"$map": {
"input": "$updated",
"as": "upd",
"in": {
"$and": [
{ "$gte": [ "$$upd", 1461013201 ] },
{ "$lte": [ "$$upd", 1461099599 ] }
]
}
}
}
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])

或者在 MongoDB 2.6 之前的版本中,您使用 $where 进行处理子句:

db.test.find({
'updated': { '$elemMatch':{ '$gte':1461013201, '$lte':1461099599 } },
"$where": function() {
return this.updated.filter(function(el) {
return el >= 1461013201 && el <= 1461099599;
}).length == this.updated.length;
}
})

要注意的是,尽管通用的 native “查询”运算符可以告诉您一个 数组成员满足条件,但它不能告诉您所有 都满足条件。

所以条件可以用 $map 来测试和 $allElementsTrue , 它们都可以从 MongoDB 2.6 获得。在 MongoDB 3.2 中,有 $filter$size 等同于下面的 JavaScript 测试。

或者您也可以使用 $where 的 JavaScript 评估根据原始数组长度测试“过滤后”的数组长度,看看它们是否仍然相同。

这是要构建的附加逻辑,以查看所有 是否匹配所提供的范围条件。聚合方法是 native 代码,而不是 JavaScript 解释。相比之下,它的运行速度

但是你还是想保留那个$elemMatch在所有情况下。

当然,这里是匹配的文档:

{
"updated" : [
1461062102,
1461062316
],
"name" : "test1",
"etc" : "etc"
}
{
"updated" : [
1461084505
],
"name" : "test3",
"etc" : "etc"
}
{
"updated" : [
1461060430
],
"name" : "test4",
"etc" : "etc"
}

关于mongodb - 匹配包含 $gte $lte 中所有数组元素的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36741690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com