以下是mongodb中的集合
{
"name" : "Tom" ,
"occupation" : "employee" ,
"data" : [
{
"owns" : "Television" ,
"company" : "xyz"
},
{
"owns" : "Television" ,
"company" : "abc"
},
{
"owns" : "laptop" ,
"company" : "abc"
} ,
{
"owns" : "Television" ,
"company" : "xyz"
}
]
}
当我查询
时 db.exp.find({"data.owns" : "Television"})
mongodb返回结果集中“拥有”:“laptop”的文档。
当我查询
时 db.exp.find({"data.owns": "Television"},{_id: 0, data: {$elemMatch: {"owns": "Television"}}})
结果只显示数据字段中的一个文档,其中找到“电视”的第一个匹配
如何查询Tom拥有电视的所有3个文件,不包括笔记本电脑文件。 预期结果
[
{
"owns" : "Television" ,
"company" : "xyz"
},
{
"owns" : "Television" ,
"company" : "abc"
},
{
"owns" : "Television" ,
"company" : "xyz"
}
]
注意:我在本例中的数据字段中仅提到了4个文档,其中原始集合包含50个以上的文档。 对不起我可怜的英语:)。
答案 0 :(得分:1)
假设您在集合exp
[
{
"name" : "Tom" ,
"occupation" : "employee" ,
"data" : [ { "owns" : "Television" , "company" : "xyz" },
{ "owns" : "Television" , "company" : "abc" },
{ "owns" : "laptop" , "company" : "abc" } ,
{ "owns" : "Television" , "company" : "xyz" } ]
},
{
"name" : "Jerry" ,
"occupation" : "employee" ,
"data" : [ { "owns" : "Mobile" , "company" : "xyz" },
{ "owns" : "Mobile" , "company" : "abc" },
{ "owns" : "laptop" , "company" : "abc" } ,
{ "owns" : "Laptop" , "company" : "xyz" } ]
}
]
然后使用您的查询db.exp.find({"data.owns" : "Television"})
,您将获得
{ "_id" : 101,
"name" : "Tom",
"occupation" : "employee",
"data" : [
{ "owns" : "Television", "company" : "xyz" },
{ "owns" : "Television", "company" : "abc" },
{ "owns" : "laptop", "company" : "abc" },
{ "owns" : "Television", "company" : "xyz" }
]
}
由于第一个文档的字段owns
等于Television
,结果将是完整的第一个文档。(包括owns
除Television
以外的字段
第二个文档不会成为结果的一部分,因为它没有任何owns
字段的值为Television
。
$elemMatch
只会返回一个文档。
http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/
如果您只希望数组中的那三个对象具有Television
作为其值,那么您可以使用游标来存储查询的整个结果(在我们的示例中只有一个文档)。
var x = db.authors.find({"data.owns": "Television"},{_id: 0, "data.owns": 1})
现在,使用每个循环只获取owns
值为Television
的文档。
答案 1 :(得分:1)
可以使用aggregation.
完成此操作db.exp.aggregate(
[
{ "$unwind": "$data" },
{ "$match": { "data.owns": "Television" }},
{
"$group": {
"_id": {
"name": "$name",
"occupation": "$occupation"
},
"data": { "$push": "$data" }
}
},
{
"$project": {
"name": "$_id.name",
"occupation": "$_id.occupation",
"data": 1,
"_id": 0
}
}
]
)
<强>结果:强>
{
"data" : [
{
"owns" : "Television",
"company" : "xyz"
},
{
"owns" : "Television",
"company" : "abc"
},
{
"owns" : "Television",
"company" : "xyz"
}
],
"name" : "Tom",
"occupation" : "employee"
}