仅查询子文档并返回匹配的子文档
Querying Subdocument and Returning Matching Subdocument only
c示例Mongo文档
{
"_id": ObjectId("5652e77f21b0f1f2692558a1"),
"category": "clothing",
"Brand": [
{
"name": "Adidas",
"key": "Adidas"
},
{
"name": "Reebok",
"key": "Reebok"
},
{
"name": "Puma",
"key": "Puma"
}
],
"Color": [
{
"name": "Red",
"key": "Red"
},
{
"name": "Green",
"key": "Green"
},
{
"name": "Blue",
"key": "Blue"
}
]
}
现在我想搜索名称为 Adidas 或 Puma 的品牌。其他要求只是 return 子文档,所以我尝试了下面给出的查询
find( { "Brand.name" : { $in : ["Reebok", "Adidas"]}},{"Brand" : 1,
"_id" : 0})
但它 return 为我提供了 Brand 数组的所有三个对象
{
"Brand" : [
{
"name" : "Adidas",
"key" : "Adidas"
},
{
"name" : "Reebok",
"key" : "Reebok"
},
{
"name" : "Puma",
"key" : "Puma"
}
]
}
我也可以通过 Javascript 确实做到这一点(遍历重新调整的数组和匹配值)但是有什么方法可以仅通过 Mongo 查询来解决我的目的。
注意:在支持 JSON 文档的 NoSql 系统中,最大的区别是这些系统不支持关系,但您始终可以通过子文档维护关系。如果这样的查询(上面提到的)是不可能的,那么我认为以子文档形式保存数据不是一个好习惯,因为你不能随意查询它。专家对此有何看法????
它工作正常。在mongo文档中是这样写的:
The $in operator selects the documents where the value of a field equals any value in the specified array.
它返回了包含 "Reebok" 或 "Adidas" 的文档。
查找查询中的 $in 旨在 return 文档而不是子文档。在您的情况下,mongoDB 提供了聚合框架。这将帮助您过滤子文档。
对于 mongoDB <= 3.0.x
db.collection.aggregate(
{ $project: { Brand: 1}},
{ $unwind: '$Brand'},
{ $match: { "Brand.name" : { $in : ["Reebok", "Adidas"]}}},
{ $group: { _id: '$_id', Brand: {$push : '$Brand' }}}
)
MongoDB 3.2方式
db.collection.aggregate([
{
$project: {
Brand: {
$filter: {
input: "$Brand",
as: "Brand",
cond: { "$$Brand.name": { $in : ["Reebok", "Adidas"]}}
}
}
}
}
])
c示例Mongo文档
{
"_id": ObjectId("5652e77f21b0f1f2692558a1"),
"category": "clothing",
"Brand": [
{
"name": "Adidas",
"key": "Adidas"
},
{
"name": "Reebok",
"key": "Reebok"
},
{
"name": "Puma",
"key": "Puma"
}
],
"Color": [
{
"name": "Red",
"key": "Red"
},
{
"name": "Green",
"key": "Green"
},
{
"name": "Blue",
"key": "Blue"
}
]
}
现在我想搜索名称为 Adidas 或 Puma 的品牌。其他要求只是 return 子文档,所以我尝试了下面给出的查询
find( { "Brand.name" : { $in : ["Reebok", "Adidas"]}},{"Brand" : 1, "_id" : 0})
但它 return 为我提供了 Brand 数组的所有三个对象
{
"Brand" : [
{
"name" : "Adidas",
"key" : "Adidas"
},
{
"name" : "Reebok",
"key" : "Reebok"
},
{
"name" : "Puma",
"key" : "Puma"
}
]
}
我也可以通过 Javascript 确实做到这一点(遍历重新调整的数组和匹配值)但是有什么方法可以仅通过 Mongo 查询来解决我的目的。
注意:在支持 JSON 文档的 NoSql 系统中,最大的区别是这些系统不支持关系,但您始终可以通过子文档维护关系。如果这样的查询(上面提到的)是不可能的,那么我认为以子文档形式保存数据不是一个好习惯,因为你不能随意查询它。专家对此有何看法????
它工作正常。在mongo文档中是这样写的:
The $in operator selects the documents where the value of a field equals any value in the specified array.
它返回了包含 "Reebok" 或 "Adidas" 的文档。
$in 旨在 return 文档而不是子文档。在您的情况下,mongoDB 提供了聚合框架。这将帮助您过滤子文档。
对于 mongoDB <= 3.0.x
db.collection.aggregate(
{ $project: { Brand: 1}},
{ $unwind: '$Brand'},
{ $match: { "Brand.name" : { $in : ["Reebok", "Adidas"]}}},
{ $group: { _id: '$_id', Brand: {$push : '$Brand' }}}
)
MongoDB 3.2方式
db.collection.aggregate([
{
$project: {
Brand: {
$filter: {
input: "$Brand",
as: "Brand",
cond: { "$$Brand.name": { $in : ["Reebok", "Adidas"]}}
}
}
}
}
])