如何在外部字段是数组的情况下加入集合?

时间:2017-08-19 09:13:39

标签: mongodb mongodb-query aggregation-framework

我正在使用mongodb并需要帮助来加入外部字段是数组中值的集合。

收集1:

(属性)

> db.properties.findOne({'agentid':'mike@gmail.com'},{'agentid':1,'contact':1})
{
        "_id" : ObjectId("56d2cc296f07d417008b4567"),
        "agentid" : "mike@gmail.com",
        "contact" : [
                {
                        "type" : "listingAgent",
                        "id" : "1",
                        "name" : "Mike",
                        "telephoneType" : "",
                        "telephone" : "",
                        "email" : "mike@gmail.com"
                }
        ]
}

收集2:

(代理)

> db.agents.findOne({'email':'mike@gmail.com'})
{
        "_id" : ObjectId("5979d1400045fecc0800004c"),
        "id" : "35",
        "agentID" : "mike@gmail.com",
        "email" : "mike@gmail.com",
        "name" : "Mike",
        "telephone" : "",
        "status" : true
}

收集3:

(用户)

> db.users.findOne({'email':'mike@gmail.com'})
{
        "_id" : ObjectId("5979d0e20045feac0d00003f"),
        "id" : "20",
        "email" : "mike@gmail.com",
        "type" : "publisher",
        "status" : "inactive",


}

现在,根据上述收藏品,我需要汇总用户并需要加入“用户”#39;与代理人一起收集'和'属性'。

问题在于集合的属性'有外国电子邮件'作为数组中的值,因此我无法对其应用查找。

我需要将这些收藏品与字段'电子邮件'但由于有外国电子邮件'作为属性中数组中的值'收藏品我没有得到结果。

我现在显示我的尝试如下

$query =
array( 
array('$lookup'=>array(
           'from'=>'agents`',
           'localField'=>'email',
           'foreignField'=>'email',
           'as'=>'users_agents'
           )
   ),

array('$unwind'=>'$properties.contact'), 

 array('$lookup'=>array(
            'from'=>'properties',
            'localField'=>'email',
            'foreignField'=>'contact.email',
            'as'=>'users_properties'
            )
   ),


array('$match'=>array(
'$and'=>array(array('users_properties.offline'=>false),
array('users_agents.status'=>true)))),


 array('$project'=>array(
            '_id'=>1,
            'id'=>1,
            'username'=>1,
            'firstname'=>1,
            'lastname'=>1,
            'email'=>1,
            'type'=>1,
            'status'=>1,
          )
 ), 

);

$collection_users->aggregate ($query );

任何人都可以帮帮我。

1 个答案:

答案 0 :(得分:0)

db.Properties.aggregate([{
    $unwind: "$contact"
},
{
    $lookup: {
        from: "Users",
        localField: "contact.email",
        foreignField: "email",
        as: "user"
    }
},
{
    $lookup: {
        from: "agents",
        localField: "contact.email",
        foreignField: "email",
        as: "agent"
    }
}])