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"
}
]
}
现在我想搜索名称是阿迪达斯或彪马的品牌。其他重新处理是仅返回子文档,所以我尝试了下面给出的查询
find({" Brand.name":{$ in:[" Reebok"," Adidas"]}},{"品牌&# 34;:1, " _id" :0})
但它将我所有三个Brand数组对象归还给我
{
"Brand" : [
{
"name" : "Adidas",
"key" : "Adidas"
},
{
"name" : "Reebok",
"key" : "Reebok"
},
{
"name" : "Puma",
"key" : "Puma"
}
]
}
我当然也可以通过Javascript来实现(通过重新调整的数组和metching值来迭代)但是有没有办法只用Mongo Query来解决我的目的。
注意:在支持JSON文档的NoSql Systems中,最大的区别是这些系统不支持关系,但您始终可以通过子文档维护关系。如果这样的查询(如上所述)是不可能的,那么我认为在子文档表单中保存数据并不是一种好的做法,因为您无法根据需要进行查询。关于这个的专家思考????
答案 0 :(得分:3)
$ in in find query旨在返回文档而不是子文档。在您的情况下,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"]}}
}
}
}
}
])
答案 1 :(得分:1)
它的工作正确。在mongo文档中写如下:
$ in运算符选择字段值等于指定数组中任何值的文档。
它返回了包含“Reebok”或“Adidas”的文档。