在mongodb中为文档数组查询的正确方法是什么?
问题描述:
以下是MongoDB的在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的函数返回一个拥有“拥有”的文件:在结果集“笔记本电脑”。
当我查询
db.exp.find({"data.owns": "Television"},{_id: 0, data: {$elemMatch: {"owns": "Television"}}})
结果仅显示从数据字段中的一个文件,其中“电视”的第一场比赛中找到
如何查询来获取所有3个文件,其中汤姆拥有电视排除便携式文件。 预期结果
[
{
"owns" : "Television" ,
"company" : "xyz"
},
{
"owns" : "Television" ,
"company" : "abc"
},
{
"owns" : "Television" ,
"company" : "xyz"
}
]
注:我在这个例子中,在与原集合了50多个文件中提到只有4在数据字段的文件。 对不起我的英文不好:)。
答
这可以使用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"
}
答
比方说你有收集两个文件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
的文件。
,而不是在外部应用程序过滤的文件,不是我们能够做到在数据库本身这个任务? – 2015-03-31 06:22:24
您可以为此使用聚合。对不起,我没有提到答案。 – Rajeshwar 2015-03-31 08:04:12