MongoDB 查询后添加匹配的键到列表
MongoDB add matched key to list after query
我在 MongoDB 中有一个包含嵌入文档列表的文档。让我们举一个带有轮胎列表的汽车文档的简化示例:
{
"make": "Toyota",
"color": "blue",
"tires": [{
"make": "Mishlen",
"size": 185
}, {
"make": "Mishlen",
"size": 210
}]
}
当我运行以下查询查找轮胎尺寸小于 200 的所有汽车时,我得到了相同的文档,但我不知道哪个轮胎与查询匹配。
{"tires.size": {$gt: 200}}
我正在努力实现某种这样的结果:
{
"make": "Toyota",
"color": "blue",
"tires": [{
"make": "Mishlen",
"size": 185,
"matched": true
}, {
"make": "Mishlen",
"size": 210,
"matched": false
}]
}
这样我就可以知道哪些轮胎符合我的查询。达到这种结果的最佳方法是什么?在性能方面。
请试试这个:
db.yourCollectionName.aggregate([
{ $addFields: {
tires: {$filter: {
input: '$tires',
as: 'each',
cond: {$lt: ['$$each.size', 200]}
}}
}}
])
收集数据:
{
"make": "Toyota",
"color": "blue",
"tires": [{
"make": "Mishlen",
"size": 185
}, {
"make": "Mishlen",
"size": 210
}]
}
结果:
{
"make": "Toyota",
"color": "blue",
"tires": [{
"make": "Mishlen",
"size": 185
}]
}
参考: $addFields , $filter
您可以使用 $cond (aggregation)
添加新的布尔值。
db.collection.aggregate([
{
$addFields: {
tires: {
$map: {
input: "$tires",
in: {
make: "$$this.make",
size: "$$this.size",
matched: {
$cond: {
if: {
$lt: [
"$$this.size",
200
]
},
then: true,
else: false
}
}
}
}
}
}
}
])
结果:
[
{
"color": "blue",
"make": "Toyota",
"tires": [
{
"make": "Mishlen",
"matched": true,
"size": 185
},
{
"make": "Mishlen",
"matched": false,
"size": 210
}
]
}
]
现场演示:MongoPlayground
我在 MongoDB 中有一个包含嵌入文档列表的文档。让我们举一个带有轮胎列表的汽车文档的简化示例:
{
"make": "Toyota",
"color": "blue",
"tires": [{
"make": "Mishlen",
"size": 185
}, {
"make": "Mishlen",
"size": 210
}]
}
当我运行以下查询查找轮胎尺寸小于 200 的所有汽车时,我得到了相同的文档,但我不知道哪个轮胎与查询匹配。
{"tires.size": {$gt: 200}}
我正在努力实现某种这样的结果:
{
"make": "Toyota",
"color": "blue",
"tires": [{
"make": "Mishlen",
"size": 185,
"matched": true
}, {
"make": "Mishlen",
"size": 210,
"matched": false
}]
}
这样我就可以知道哪些轮胎符合我的查询。达到这种结果的最佳方法是什么?在性能方面。
请试试这个:
db.yourCollectionName.aggregate([
{ $addFields: {
tires: {$filter: {
input: '$tires',
as: 'each',
cond: {$lt: ['$$each.size', 200]}
}}
}}
])
收集数据:
{
"make": "Toyota",
"color": "blue",
"tires": [{
"make": "Mishlen",
"size": 185
}, {
"make": "Mishlen",
"size": 210
}]
}
结果:
{
"make": "Toyota",
"color": "blue",
"tires": [{
"make": "Mishlen",
"size": 185
}]
}
参考: $addFields , $filter
您可以使用 $cond (aggregation)
添加新的布尔值。
db.collection.aggregate([
{
$addFields: {
tires: {
$map: {
input: "$tires",
in: {
make: "$$this.make",
size: "$$this.size",
matched: {
$cond: {
if: {
$lt: [
"$$this.size",
200
]
},
then: true,
else: false
}
}
}
}
}
}
}
])
结果:
[
{
"color": "blue",
"make": "Toyota",
"tires": [
{
"make": "Mishlen",
"matched": true,
"size": 185
},
{
"make": "Mishlen",
"matched": false,
"size": 210
}
]
}
]
现场演示:MongoPlayground