如何合并 unwind mongodb 的输出?
How to merge output from unwind mongodb?
例如,我在这样的集合中有数据:
db.inventory2.insertMany([
{ "_id" : 1, "item" : "ABC", price: NumberDecimal("80"), "sizes": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "EFG", price: NumberDecimal("120"), "sizes" : [ ] },
{ "_id" : 3, "item" : "IJK", price: NumberDecimal("160"), "sizes": ["M"] },
])
并且,在添加 $unwind 时,我想 select 具有尺寸的项目不为空。
我加上$unwind后的结果:
db.inventory2.aggregate( [ { $unwind: { path: "$sizes" } } ] )
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "S" }
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "M" }
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "L" }
{ "_id" : 3, "item" : "IJK", "price" : NumberDecimal("160"), "sizes" : "M" }
我的问题是,当我添加$unwind时,如何不分隔结果项“ABC”。我的期望结果是这样的:
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : ["S", "M", "L"] }
{ "_id" : 3, "item" : "IJK", "price" : NumberDecimal("160"), "sizes" : ["M"] }
感谢之前的帮助。
根据我从您的问题中了解到的情况,您正在尝试使用 sizes
不是空数组来过滤文档。
您不需要 $unwind
舞台,而是 $match
舞台。
db.collection.aggregate([
{
$match: {
sizes: {
$ne: []
}
}
}
])
或
db.collection.aggregate([
{
$match: {
$expr: {
$ne: [
{
"$size": "$sizes"
},
0
]
}
}
}
])
用这个代替 $unwind 怎么样:
db.inventory2.aggregate([
{
$addFields : {
"sizeCount" : {$size: "$sizes"}
}
},
{$match: {"sizeCount" : {$gt: 0}}},
{$project: {"sizeCount" : 0}}
])
例如,我在这样的集合中有数据:
db.inventory2.insertMany([
{ "_id" : 1, "item" : "ABC", price: NumberDecimal("80"), "sizes": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "EFG", price: NumberDecimal("120"), "sizes" : [ ] },
{ "_id" : 3, "item" : "IJK", price: NumberDecimal("160"), "sizes": ["M"] },
])
并且,在添加 $unwind 时,我想 select 具有尺寸的项目不为空。
我加上$unwind后的结果:
db.inventory2.aggregate( [ { $unwind: { path: "$sizes" } } ] )
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "S" }
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "M" }
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "L" }
{ "_id" : 3, "item" : "IJK", "price" : NumberDecimal("160"), "sizes" : "M" }
我的问题是,当我添加$unwind时,如何不分隔结果项“ABC”。我的期望结果是这样的:
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : ["S", "M", "L"] }
{ "_id" : 3, "item" : "IJK", "price" : NumberDecimal("160"), "sizes" : ["M"] }
感谢之前的帮助。
根据我从您的问题中了解到的情况,您正在尝试使用 sizes
不是空数组来过滤文档。
您不需要 $unwind
舞台,而是 $match
舞台。
db.collection.aggregate([
{
$match: {
sizes: {
$ne: []
}
}
}
])
或
db.collection.aggregate([
{
$match: {
$expr: {
$ne: [
{
"$size": "$sizes"
},
0
]
}
}
}
])
用这个代替 $unwind 怎么样:
db.inventory2.aggregate([
{
$addFields : {
"sizeCount" : {$size: "$sizes"}
}
},
{$match: {"sizeCount" : {$gt: 0}}},
{$project: {"sizeCount" : 0}}
])