最好看看$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" }
通过使用聚合,您可以按步骤查询并对结果进行更改,但由于您使用了一些额外的过滤器,因此结果将花费更多时间而不是正常查询。