【问题标题】:showing derived mongo documents based on values of an array in a single mongo db record根据单个 mongo db 记录中的数组值显示派生的 mongo 文档
【发布时间】:2020-06-25 21:21:05
【问题描述】:

我在桌车中有一个 mongo db 记录,其结构如下所示

name: Ferrari
color: [ red, blue, green ]

如何在 mongo db 中运行 find 查询,该查询将为 color 中存在的值分别显示一条记录? 样本输出:

name: Ferrari
color: red
name: Ferrari
color: blue
name: Ferrari
color: green

【问题讨论】:

标签: mongodb mongodb-query


【解决方案1】:

最好看看$unwind,它实际上就是你要找的。这是如何使用它的示例。

假设您的收藏包含以下内容:

[
  { "_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" },
  { "_id" : 4, "item" : "LMN" , price: NumberDecimal("10") },
  { "_id" : 5, "item" : "XYZ", price: NumberDecimal("5.75"), "sizes" : null }
]

您可以从 sizes 获得相同 _id 但每个大小的结果,因此您可以通过运行以下两个选项之一来实现:

db.inventory2.aggregate( [ { $unwind: "$sizes" } ] )
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" }

但是对你来说重要的是得到自定义结果而不是其他对象。你可以使用$match来完成你的查询,使用聚合你可以得到具体的结果。假设您要查找项目“ABC”并拆分该特定项目的所有尺寸:

db.inventory2.aggregate( [
//Stage one - find items named "ABC"
 {$match:{"item":"ABC"}},
//Stage two - split result of sizes array
{ $unwind: "$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" }

通过使用聚合,您可以按步骤查询并对结果进行更改,但由于您使用了一些额外的过滤器,因此结果将花费更多时间而不是正常查询。

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2022-12-18
    • 2021-11-15
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    相关资源
    最近更新 更多