MongoDB筛选器数组

3

数据结构:

[{
  "_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"
}]

图片

我尝试像这样:

图片2

错误

/////////////////////////////////////////////////////////////// 我需要按名称过滤数组中的数组(仓库内的产品); 如果没有项目,响应将是包含所有产品的数组。 输出结果如果(按“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
    }
  ]
}]

我尝试了所有的方法,但是仍无法解决。


基本上,“project”是为了选择输出属性,“filter”是为了找到正确的文档。您正在使用一些受限制的MongoDB GUI客户端进行此操作...如果您在代码中执行此操作,您将拥有更多的控制权。 - Dima G
2个回答

1
如果你只是在数组中过滤元素,即使只有一个元素匹配,整个数组也会被返回,如果没有匹配,则什么都不会返回。因此,您需要使用$unwind运算符将数组分成不同的文档,并且只有在此之后,才尝试使用$match筛选结果。
以下查询可能解决您的问题:
db.collection.aggregate([
  {"$unwind": "$product"},
  {"$match": {"product.name": "FirstWarehouseName1"}} // replace here with the name you want
])

工作中 mongoplayground

如果我可以的话,给你一个提示:你应该将每个产品存储在不同的文档中,尽管MongoDB是无模式的,可以允许我们拥有几乎任何格式的文档,但请记住,每个文档应包含常规关系型数据库中一个信息行的等效内容。否则,你将开始遇到这些问题,还会面临性能问题。


1
你可以做
[{
    $unwind: {
        path: "$product",
        preserveNullAndEmptyArrays: false
    }
}, {
    $match: {
        "product.name": {
            $regex: "Name3"
        }
    }
}, {
    $group: {
        _id: "$_id",
        product: {
            $push: "$product"
        }
    }
}]

正在工作中 Mongo playground


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接