MongoDB 过滤 Node.JS 中的嵌套数组
MongoDB Filter Nested Array in Node.JS
我在 MongoDB 中有一个看起来像这样的集合:
[
{
"machine": 1,
"status": true,
"comments": [
{
"machine": 1,
"status": false,
"emp": "158",
"comment": "testing the latest update"
},
{
"machine": 1,
"status": false,
"emp": "007",
"comment": "2nd comment"
},
]
},
{
"machine": 2,
"status": true,
"comments": [
{
"machine": 2,
"status": true,
"emp": "158",
"comment": "checking dcm 2"
}
]
}
]
我想 return 所有顶级文档(机器 1 和 2),但只有 emp“007”的评论。我也只想return最新的评论,不是全部。我让那部分与这条线一起工作:
await db.collection('status').find().project( { "comments": { "$slice": -1 } }).toArray()
但我终其一生都无法通过嵌套数组中的 'emp' 进行过滤。
db.collection.aggregate([
{
$match: {
"comments.machine": {
$in: [
1,
2
]
},
"comments.emp": "007"
}
},
{
"$addFields": {//addFields with same name overwrites the array
"comments": {
"$filter": { //Filter the array elements based on condition
"input": "$comments",
"as": "comment",
"cond": {
$eq: [
"$$comment.emp",
"007"
]
}
}
}
}
}
])
如果您有日期,请按日期排序并获得前一个。
您可以使用 $filter
的简单聚合来获得干净的输出:
db.collection.aggregate([
{
$project: {
machine: 1,
status: 1,
comments: {
$slice: [
{
$filter: {
input: "$comments",
as: "item",
cond: {$eq: ["$$item.emp", "007"]}}
}, -1
]
},
_id: 0
}
},
{$set: {comments: {$arrayElemAt: ["$comments", 0]}}},
])
我在 MongoDB 中有一个看起来像这样的集合:
[
{
"machine": 1,
"status": true,
"comments": [
{
"machine": 1,
"status": false,
"emp": "158",
"comment": "testing the latest update"
},
{
"machine": 1,
"status": false,
"emp": "007",
"comment": "2nd comment"
},
]
},
{
"machine": 2,
"status": true,
"comments": [
{
"machine": 2,
"status": true,
"emp": "158",
"comment": "checking dcm 2"
}
]
}
]
我想 return 所有顶级文档(机器 1 和 2),但只有 emp“007”的评论。我也只想return最新的评论,不是全部。我让那部分与这条线一起工作:
await db.collection('status').find().project( { "comments": { "$slice": -1 } }).toArray()
但我终其一生都无法通过嵌套数组中的 'emp' 进行过滤。
db.collection.aggregate([
{
$match: {
"comments.machine": {
$in: [
1,
2
]
},
"comments.emp": "007"
}
},
{
"$addFields": {//addFields with same name overwrites the array
"comments": {
"$filter": { //Filter the array elements based on condition
"input": "$comments",
"as": "comment",
"cond": {
$eq: [
"$$comment.emp",
"007"
]
}
}
}
}
}
])
如果您有日期,请按日期排序并获得前一个。
您可以使用 $filter
的简单聚合来获得干净的输出:
db.collection.aggregate([
{
$project: {
machine: 1,
status: 1,
comments: {
$slice: [
{
$filter: {
input: "$comments",
as: "item",
cond: {$eq: ["$$item.emp", "007"]}}
}, -1
]
},
_id: 0
}
},
{$set: {comments: {$arrayElemAt: ["$comments", 0]}}},
])