mongodb查询内部数组的属性值,其对象数大于n值?

时间:2018-01-26 09:17:36

标签: mongodb mongodb-query

我有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)

的对象,请使用

3 个答案:

答案 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)

您可以计算嵌入式文档数组中的喜欢数量,并在计数小于预期时进行过滤。

  1. $addFields添加字段noOfLikes
  2. $map根据$cond
  3. 将事件映射到1或0
  4. $sum添加映射的1或0
  5. $match过滤所有少于2个noOfLikes
  6. 管道

    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阶段执行相同操作。