gpt4 book ai didi

node.js - 过滤数组时如何包含空数组

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

这是我的元素模型。

const itemSchema = new Schema({
name: String,
category: String,
occupied: [Number],
active: { type: Boolean, default: true },
});

我想过滤“占用”数组。所以我使用聚合和展开“占用”字段。

所以我应用匹配查询。并按 _id 分组。但是,如果过滤后的“占用”数组为空,则该项目消失。

这是我的代码

Item.aggregate([
{ $match: {
active: true
}},
{ $unwind:
"$occupied",
},
{ $match: { $and: [
{ occupied: { $gte: 100 }},
{ occupied: { $lt: 200 }}
]}},
{ $group : {
_id: "$_id",
name: { $first: "$name"},
category: { $first: "$category"},
occupied: { $addToSet : "$occupied" }
}}
], (err, items) => {
if (err) throw err;
return res.json({ data: items });
});

这是示例数据集

{ 
"_id" : ObjectId("59c1bced987fa30b7421a3eb"),
"name" : "printer1",
"category" : "printer",
"occupied" : [ 95, 100, 145, 200 ],
"active" : true
},
{
"_id" : ObjectId("59c2dbed992fb91b7421b1ad"),
"name" : "printer2",
"category" : "printer",
"occupied" : [ ],
"active" : true
}

上面查询的结果

[
{
"_id" : ObjectId("59c1bced987fa30b7421a3eb"),
"name" : "printer1",
"category" : "printer",
"occupied" : [ 100, 145 ],
"active" : true
}
]

和我想要的结果

[
{
"_id" : ObjectId("59c1bced987fa30b7421a3eb"),
"name" : "printer1",
"category" : "printer",
"occupied" : [ 100, 145 ],
"active" : true
},
{
"_id" : ObjectId("59c2dbed992fb91b7421b1ad"),
"name" : "printer2",
"category" : "printer",
"occupied" : [ ],
"active" : true
}
]

我怎么能这样做??

提前致谢。

最佳答案

在最简单的形式中,您只需不使用 $unwind 即可保留它首先。您应用的条件意味着您正在寻找与特定值匹配的“唯一集”。

为此,您改为使用 $filter ,和一个“集合运算符”,如 $setUnion首先将输入值减少为“集合”:

Item.aggregate([
{ "$match": { "active": true } },
{ "$project": {
"name": 1,
"category": 1,
"occupied": {
"$filter": {
"input": { "$setUnion": [ "$occupied", []] },
"as": "o",
"cond": {
"$and": [
{ "$gte": ["$$o", 100 ] },
{ "$lt": ["$$o", 200] }
]
}
}
}
}}
], (err, items) => {
if (err) throw err;
return res.json({ data: items });
});

自 MongoDB v3 以来,两者都已存在,因此以这种方式做事是很常见的做法。

如果出于某种原因您仍在使用 MongoDB 2.6,那么您可以申请 $map$setDifference相反:

Item.aggregate([
{ "$match": { "active": true } },
{ "$project": {
"name": 1,
"category": 1,
"occupied": {
"$setDifference": [
{ "$map": {
"input": "$occupied",
"as": "o",
"in": {
"$cond": {
"if": {
"$and": [
{ "$gte": ["$$o", 100 ] },
{ "$lt": ["$$o", 200] }
]
},
"then": "$$o",
"else": false
}
}
}},
[false]
]
}
}}
], (err, items) => {
if (err) throw err;
return res.json({ data: items });
});

这与将数组分开、过滤项目并将其放回原处与 $addToSet 相同的“唯一集”结果.不同之处在于它的效率要高得多,并且可以毫无问题地保留(或生成)一个空数组。

关于node.js - 过滤数组时如何包含空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46312543/

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