collection
/* 1 */
{
"_id" : ObjectId("5c89fb827f5cc02498908c53"),
"item" : "journal",
"tags" : [
{
"id" : 1.0,
"name" : "blank"
},
{
"id" : 2.0,
"name" : "red"
}
]
}
/* 2 */
{
"_id" : ObjectId("5c89fb827f5cc02498908c54"),
"item" : "mat",
"tags" : [
{
"id" : 1.0,
"name" : "gray"
},
{
"id" : 2.0,
"name" : "blank"
},
{
"id" : 3.0,
"name" : "blank"
}
]
}
/* 3 */
{
"_id" : ObjectId("5c89fb827f5cc02498908c55"),
"item" : "mousepad",
"tags" : [
{
"id" : 1.0,
"name" : "gel"
},
{
"id" : 2.0,
"name" : "blue"
}
]
}
1
使用mongo查询一个对象数组中元素属性为特定值的数据,期望查询结果为:
/* 1 */
{
"_id" : ObjectId("5c89fb827f5cc02498908c53"),
"tags" : []
}
/* 2 */
{
"_id" : ObjectId("5c89fb827f5cc02498908c54"),
"tags" : [
{
"id" : 2.0,
"name" : "blank"
},
{
"id" : 3.0,
"name" : "blank"
}
]
}
/* 3 */
{
"_id" : ObjectId("5c89fb827f5cc02498908c55"),
"tags" : []
}
语句:
db.test.aggregate(
[
{
$project:{
tags:{
$filter:{
input:"$tags",
as:"tag",
cond:{$eq:["$$tag.name", "blank"]}
}
}
}
},
{
$project:{
tags:{
$filter:{
input:"$tags",
as:"tag",
cond:{$gte:[{$size:"$tags"}, 2]}
}
}
}
}
])
2
若想得到每条数据里tags中name=blank的数据个数,语句为:
db.test.aggregate(
[
{
$project:{
tags:{
$filter:{
input:"$tags",
as:"tag",
cond:{$eq:["$$tag.name", "blank"]}
}
}
}
},
{
$project:{
count:{
$size: "$tags"
}
}
}
])
结果为:
/* 1 */
{
"_id" : ObjectId("5c89fb827f5cc02498908c53"),
"count" : 1
}
/* 2 */
{
"_id" : ObjectId("5c89fb827f5cc02498908c54"),
"count" : 2
}
/* 3 */
{
"_id" : ObjectId("5c89fb827f5cc02498908c55"),
"count" : 0
}
3
若想取count=2的数据,语句:
db.test.aggregate(
[
{
$project:{
tags:{
$filter:{
input:"$tags",
as:"tag",
cond:{$eq:["$$tag.name", "blank"]}
}
}
}
},
{
$project:{
count:{
$size: "$tags"
}
}
},
{
$match:{
count:2
}
}
])
效果:
/* 1 */
{
"_id" : ObjectId("5c89fb827f5cc02498908c54"),
"count" : 2
}
好的mongo聚合查询博客:
- https://docs.mongodb.com/manual/tutorial/query-array-of-documents/