我有mongo文件如下,
{
"_id" : ObjectId("5a5ee704a2032a61f3be28"),
"companyID" : "somevalue",
"Name" : "some name",
"facebookEvents" : [
{
"type" : "like",
"message" : "sdfdfdf",
"link" : "http://www.facebook.com/140",
"timeStamp" : 1431014457000.0,
},
{
"type" : "comment",
"message" : "jjjjmmmm",
"link" : "http://www.facebook.com/140",
"timeStamp" : 1431014457000.0
},
{
"type" : "like",
"message" : "Try our Android application",
"link" : "http://www.facebook.com/140",
"timeStamp" : 1431014457000.0
},
,
{
"type" : "like",
"message" : "Try our Android application",
"link" : "http://www.facebook.com/140",
"timeStamp" : 1431014457000.0
}
]
}
是否可以查询"type"="like"
内有两个以上facebookEvents
个对象的文档,例如,上述文档是有效的结果,因为它有两个以上的对象"type"="like"
在`facebookEvents'内我按照this question解释的方式试了一下,但这并不是我想要的。
任何帮助
更新: mongo版本:3.4.4
我尝试使用聚合,如下所示,
db.getCollection('customerData').aggregate( [
{ $project : { 'companyID' : 1, 'facebookEvents' : 1,'Name':1 } },
{ $unwind : "$facebookEvents" },
{ $match : { 'facebookEvents.type' : { $eq: 'like' } } },
{ $group : { _id : "$_id", likes : { $sum : 1} }},
{$match:{likes:{$gt:2}}}
])
它返回正确的对象但不包含原始对象中的所有字段。如果有人可以帮我检索所有字段(Name,facebookEvents,companyID)
的对象,请使用答案 0 :(得分:2)
一个简单的总结。只需显示带有"喜欢"的公司ID总。可以轻松扩展以根据需要显示更多数据。
'C:\Users\user\Client\vendor\swiftmailer\swiftmailer' already exists and is not an empty directory.
示例输出:
db.collection.aggregate( [
{ $project : { 'companyID' : 1, 'facebookEvents' : 1, } },
{ $unwind : "$facebookEvents" },
{ $match : { 'facebookEvents.type' : { $eq: 'like' } } },
{ $group : { _id : {"companyID": "$companyID"}, likes : { $sum : 1} } },
{ $match : { 'likes' : { $gt : 2 } } }
] )
要显示问题中请求的输出,请尝试以下操作:
"_id" : { "companyID" : "SomeOtherValue" }, "likes" : 2.0 }
"_id" : { "companyID" : "someValue"}, "likes" : 4.0
输出:
db.collection.aggregate( [
{ $unwind : "$facebookEvents" },
{ $match : { 'facebookEvents.type' : { $eq: 'like' } } },
{ $group : { _id : { companyID : "$companyID", Name : "$Name"},
facebookEvents : {$push : "$facebookEvents"},
TotalLikes : { $sum : 1} }},
{ $match : { likes : { $gt : 2 } } }
])
答案 1 :(得分:0)
您可以计算嵌入式文档数组中的喜欢数量,并在计数小于预期时进行过滤。
$addFields
添加字段noOfLikes $map
根据$cond
$sum
添加映射的1或0 $match
过滤所有少于2个noOfLikes 管道
db.fb.aggregate(
[
{
$addFields : { noOfLikes : { $sum : { $map : { input : "$facebookEvents", as : "f", in : {$cond : [ { $eq : ["$$f.type" , "like"] }, 1, 0 ]} }}}}
},
{$match : {$expr : {$gte : ["noOfLikes" , 2]}}}
]
)
或使用问题中链接的unwind/group/project
db.fb.aggregate(
[
{$unwind : "$facebookEvents"},
{$group : {_id : {
_id : "$_id",
companyID : "$companyID",
Name : "$Name"
},
facebookEvents : {$push : "$facebookEvents"},
noOfLikes : { $sum : {$cond : [ { $eq : ["$facebookEvents.type" , "like"] }, 1, 0 ]}}
}
},
{$match : {$expr : {$gt : ["noOfLikes" , 2]}}},
{$project : {_id : "$_id._id", companyID : "$_id.companyID", Name : "$_id.Name",facebookEvents:1 }}
]
)
答案 2 :(得分:0)
从v3.6开始,您可以从$expr运算符中受益,以便在find
个查询中使用聚合表达式:
db.collection.find( { $expr: {
$gte:[
{ $size: {
$filter: {
input: "$facebookEvents",
as: "event",
cond: { $eq: [ "$$event.type", "like" ] }
}
} },
2
]
} } )
对于早期版本,您可以使用aggregation
管道在$match
阶段执行相同操作。