MongoDb 过滤阵列
MongoDb Filter Array
数据结构:
[{
"_id": {
"$oid": "5f1e91da1d840d673d159e69"
},
"product": [
{
"_id": "1",
"name": "FirstWarehouseName1",
"image": "FirstWarehousePhoto1",
"manufacturer": "FirstWarehouseProducer1",
"warehouse": "Warehouse1",
"price": "32",
"amount": 344
},
{
"_id": "2",
"name": "FirstWarehouseName2",
"image": "FirstWarehousePhoto2",
"manufacturer": "FirstWarehouseProducer2",
"warehouse": "Warehouse1",
"price": "12",
"amount": 631
},
{
"_id": "3",
"name": "FirstWarehouseName3",
"image": "FirstWarehousePhoto3",
"manufacturer": "FirstWarehouseProducer3",
"warehouse": "Warehouse1",
"price": "66",
"amount": 752
}
],
"_class": "pl.com.ttsw.intership.product_model.Products"
},{
"_id": {
"$oid": "5f1e91da1d840d673d159e6a"
},
"product": [
{
"_id": "1",
"name": "SecondWarehouseName1",
"image": "SecondWarehousePhoto1",
"manufacturer": "SecondWarehouseProducerName1",
"warehouse": "Warehouse2",
"price": "32",
"amount": 344
},
{
"_id": "2",
"name": "SecondWarehouseName2",
"image": "SecondWarehousePhoto2",
"manufacturer": "SecondWarehouseProducerName2",
"warehouse": "Warehouse2",
"price": "12",
"amount": 631
},
{
"_id": "3",
"name": "SecondWarehouseName3",
"image": "SecondWarehousePhoto3",
"manufacturer": "SecondWarehouseProducerName3",
"warehouse": "Warehouse2",
"price": "66",
"amount": 752
}
],
"_class": "pl.com.ttsw.intership.product_model.Products"
},{
"_id": {
"$oid": "5f1e91db1d840d673d159e6b"
},
"product": [
{
"_id": "1",
"name": "ThirdWarehouseName1",
"image": "ThirdWarehousePhoto1",
"manufacturer": "ThirdWarehouse1",
"warehouse": "Warehouse3",
"price": "44",
"amount": 123
},
{
"_id": "2",
"name": "ThirdWarehouseName2",
"image": "ThirdWarehousePhoto2",
"manufacturer": "ThirdWarehouse2",
"warehouse": "Warehouse3",
"price": "11",
"amount": 442
},
{
"_id": "3",
"name": "ThirdWarehouseName3",
"image": "ThirdWarehousePhoto3",
"manufacturer": "ThirdWarehouse3",
"warehouse": "Warehouse3",
"price": "2",
"amount": 2213
}
],
"_class": "pl.com.ttsw.intership.product_model.Products"
}]
IMG
我也这样尝试:
IMG2
ERROR
////////////////////////////////////////// //////////////////
我需要按名称过滤数组中的数组(仓库中的产品);
如果我没有项目响应是 Array with all products。
输出结果 if (search By "Name3")
[{
"_id": {
"$oid": "5f1e91da1d840d673d159e69"
},
"product": [
{
"_id": "3",
"name": "FirstWarehouseName3",
"image": "FirstWarehousePhoto3",
"manufacturer": "FirstWarehouseProducer3",
"warehouse": "Warehouse1",
"price": "66",
"amount": 752
}
]
},{
"_id": {
"$oid": "5f1e91da1d840d673d159e6a"
},
"product": [
{
"_id": "3",
"name": "SecondWarehouseName3",
"image": "SecondWarehousePhoto3",
"manufacturer": "SecondWarehouseProducerName3",
"warehouse": "Warehouse2",
"price": "66",
"amount": 752
}
]
},{
"_id": {
"$oid": "5f1e91db1d840d673d159e6b"
},
"product": [
{
"_id": "3",
"name": "ThirdWarehouseName3",
"image": "ThirdWarehousePhoto3",
"manufacturer": "ThirdWarehouse3",
"warehouse": "Warehouse3",
"price": "2",
"amount": 2213
}
]
}]
各种方法都试过了,还是不行。
//////////////////////////////
你可以做到
[{
$unwind: {
path: "$product",
preserveNullAndEmptyArrays: false
}
}, {
$match: {
"product.name": {
$regex: "Name3"
}
}
}, {
$group: {
_id: "$_id",
product: {
$push: "$product"
}
}
}]
如果只是过滤一个数组中的一个元素,即使只有一个元素匹配,也会返回整个数组,如果不匹配则什么都不返回。因此,您需要使用 $unwind
运算符将数组分成不同的文档,然后才尝试使用 $match
.
过滤结果
以下查询可能会解决您的问题:
db.collection.aggregate([
{"$unwind": "$product"},
{"$match": {"product.name": "FirstWarehouseName1"}} // replace here with the name you want
])
如果可以的话,只是一个提示:您应该将每个产品存储在不同的文档中,尽管 MongoDB 是无模式的并且允许我们拥有几乎任何格式的文档,请记住每个文档应包含相当于常规关系数据库中一行信息的信息。否则,您将开始遇到这些问题,此外还会遇到性能问题。
数据结构:
[{
"_id": {
"$oid": "5f1e91da1d840d673d159e69"
},
"product": [
{
"_id": "1",
"name": "FirstWarehouseName1",
"image": "FirstWarehousePhoto1",
"manufacturer": "FirstWarehouseProducer1",
"warehouse": "Warehouse1",
"price": "32",
"amount": 344
},
{
"_id": "2",
"name": "FirstWarehouseName2",
"image": "FirstWarehousePhoto2",
"manufacturer": "FirstWarehouseProducer2",
"warehouse": "Warehouse1",
"price": "12",
"amount": 631
},
{
"_id": "3",
"name": "FirstWarehouseName3",
"image": "FirstWarehousePhoto3",
"manufacturer": "FirstWarehouseProducer3",
"warehouse": "Warehouse1",
"price": "66",
"amount": 752
}
],
"_class": "pl.com.ttsw.intership.product_model.Products"
},{
"_id": {
"$oid": "5f1e91da1d840d673d159e6a"
},
"product": [
{
"_id": "1",
"name": "SecondWarehouseName1",
"image": "SecondWarehousePhoto1",
"manufacturer": "SecondWarehouseProducerName1",
"warehouse": "Warehouse2",
"price": "32",
"amount": 344
},
{
"_id": "2",
"name": "SecondWarehouseName2",
"image": "SecondWarehousePhoto2",
"manufacturer": "SecondWarehouseProducerName2",
"warehouse": "Warehouse2",
"price": "12",
"amount": 631
},
{
"_id": "3",
"name": "SecondWarehouseName3",
"image": "SecondWarehousePhoto3",
"manufacturer": "SecondWarehouseProducerName3",
"warehouse": "Warehouse2",
"price": "66",
"amount": 752
}
],
"_class": "pl.com.ttsw.intership.product_model.Products"
},{
"_id": {
"$oid": "5f1e91db1d840d673d159e6b"
},
"product": [
{
"_id": "1",
"name": "ThirdWarehouseName1",
"image": "ThirdWarehousePhoto1",
"manufacturer": "ThirdWarehouse1",
"warehouse": "Warehouse3",
"price": "44",
"amount": 123
},
{
"_id": "2",
"name": "ThirdWarehouseName2",
"image": "ThirdWarehousePhoto2",
"manufacturer": "ThirdWarehouse2",
"warehouse": "Warehouse3",
"price": "11",
"amount": 442
},
{
"_id": "3",
"name": "ThirdWarehouseName3",
"image": "ThirdWarehousePhoto3",
"manufacturer": "ThirdWarehouse3",
"warehouse": "Warehouse3",
"price": "2",
"amount": 2213
}
],
"_class": "pl.com.ttsw.intership.product_model.Products"
}]
IMG
我也这样尝试:
IMG2
ERROR
////////////////////////////////////////// ////////////////// 我需要按名称过滤数组中的数组(仓库中的产品); 如果我没有项目响应是 Array with all products。 输出结果 if (search By "Name3")
[{
"_id": {
"$oid": "5f1e91da1d840d673d159e69"
},
"product": [
{
"_id": "3",
"name": "FirstWarehouseName3",
"image": "FirstWarehousePhoto3",
"manufacturer": "FirstWarehouseProducer3",
"warehouse": "Warehouse1",
"price": "66",
"amount": 752
}
]
},{
"_id": {
"$oid": "5f1e91da1d840d673d159e6a"
},
"product": [
{
"_id": "3",
"name": "SecondWarehouseName3",
"image": "SecondWarehousePhoto3",
"manufacturer": "SecondWarehouseProducerName3",
"warehouse": "Warehouse2",
"price": "66",
"amount": 752
}
]
},{
"_id": {
"$oid": "5f1e91db1d840d673d159e6b"
},
"product": [
{
"_id": "3",
"name": "ThirdWarehouseName3",
"image": "ThirdWarehousePhoto3",
"manufacturer": "ThirdWarehouse3",
"warehouse": "Warehouse3",
"price": "2",
"amount": 2213
}
]
}]
各种方法都试过了,还是不行。 //////////////////////////////
你可以做到
[{
$unwind: {
path: "$product",
preserveNullAndEmptyArrays: false
}
}, {
$match: {
"product.name": {
$regex: "Name3"
}
}
}, {
$group: {
_id: "$_id",
product: {
$push: "$product"
}
}
}]
如果只是过滤一个数组中的一个元素,即使只有一个元素匹配,也会返回整个数组,如果不匹配则什么都不返回。因此,您需要使用 $unwind
运算符将数组分成不同的文档,然后才尝试使用 $match
.
以下查询可能会解决您的问题:
db.collection.aggregate([
{"$unwind": "$product"},
{"$match": {"product.name": "FirstWarehouseName1"}} // replace here with the name you want
])
如果可以的话,只是一个提示:您应该将每个产品存储在不同的文档中,尽管 MongoDB 是无模式的并且允许我们拥有几乎任何格式的文档,请记住每个文档应包含相当于常规关系数据库中一行信息的信息。否则,您将开始遇到这些问题,此外还会遇到性能问题。