MongoDB查询在过滤数组后根据数组大小返回所有内容?
Posted
技术标签:
【中文标题】MongoDB查询在过滤数组后根据数组大小返回所有内容?【英文标题】:MongoDB query to return all based on an array size after filtering array? 【发布时间】:2021-12-28 18:27:20 【问题描述】:我正在尝试为 Mongo 查找查询创建一个模板,该模板将返回与数组属性的给定大小匹配的所有内容。例如,这是查找包含大小为 5 的数组的所有文档的查询:
arrayProperty: $size: 5
问题:其中一些数组的值为“nil”,并且不希望在查询大小时计算这些值。例如,我希望在查询大小为 5 时返回包含这样结构的数组的文档:
[0,1,2,3,"nil"]
我已经在聚合框架中做了这样的事情:
[
$project:
item: 1,
numberOfItems: $size:
$filter:
input: "$arrayProperty",
cond: $ne: [ "$$this", "nil" ]
]
这是计算每个数组的长度/大小,并将该数字推送到名为 numberOfItems 的数组中。我相信我需要将过滤后的结果传递给 $size
运算符。不过,我似乎无法弄清楚如何在查找查询语法中利用这一点,我迫切需要一些帮助。
我所描述的流程的想法是这样的,尽管这是无效的:
$expr:
$filter:
input: "$arrayProperty",
cond: $ne: [ "$$this", "nil" ]
: $size: 5
谁能帮助我?如何正确地将过滤结果传递给 $size
运算符?我找不到人们试图做这样的事情的任何其他问题/答案。
另一种情况是当“nil”作为值嵌套在数组中的 JSON 对象中时,我知道这需要不同的解决方案。示例:
[
"arrayProperty": [
"model": "sedan",
"turbo": "nil"
,
"model": "sedan",
"turbo": "60cc"
]
,
"arrayProperty": [
"model": "coupe",
"turbo": "50cc"
,
"model": "coupe",
"turbo": "60cc"
]
]
【问题讨论】:
【参考方案1】:你可以试试$ne
条件一起$size
条件,
db.collection.find(
arrayProperty:
$size: 5,
$ne: "nil"
)
Playground
另一种情况是当“nil”作为值嵌套在数组中的 JSON 对象中时,我知道这需要不同的解决方案。
db.collection.find(
"arrayProperty.turbo":
$ne: "nil"
,
arrayProperty:
$size: 2
)
Playground
【讨论】:
这是完美的,谢谢。我可以再给你一个吗,如果“nil”在嵌套的 JSON 对象中,你会怎么做?我的实验导致所有结果仍然返回,这里是示例:mongoplayground.net/p/8HoS1ZJNW5b 将使用此编辑原始问题以及未来的观众。 测试子文档字段,使用点符号。还要注意可能意外排除了此选项中的第三个选择:mongoplayground.net/p/0nx7au-xPrM以上是关于MongoDB查询在过滤数组后根据数组大小返回所有内容?的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB Compass:对数组对象的过滤查询不起作用