MongoDB - 如何验证嵌套数组项是否包含在同一文档中的另一个嵌套数组项中?

时间:2017-01-26 04:19:32

标签: arrays mongodb

这里的想法是返回用户关注者的一系列文档,如果该用户是该关注者的朋友,则返回该信息。

到目前为止,我有:

db.getCollection('users').aggregate([
    { $match: { _id: ObjectId("588877d82523b4395039910a") } },
    { $lookup: {
            from: 'users',
            localField: 'followers',
            foreignField: '_id',
            as: 's_followers'
        }
    },
    { 
        $project: {
            "s_followers._id": 1,
            "s_followers.isFriend": {
                $in: ["s_followers.id",
                      { $setIntersection: ["$friends", "$followers"] }
                ]}
        }
    }
])

但是$ in运算符中使用的“s_followers.id”似乎没有从关注者那里检索_id信息,所以它总是返回false。

当我直接使用ObjectId时,我得到了我想要的结果:

"s_followers.isFriend": {
                    $in: [ObjectId("588877d82523b4395039910a"),
                          { $setIntersection: ["$friends", "$followers"] }
                    ]}

但我真的需要这个ID作为跟随者_id的引用。

预期结果如下:

{
    "_id" : ObjectId("588877d82523b4395039910a"),
    "s_followers" : [ 
        {
            "_id" : ObjectId("5888687e56be8f172844d96f"),
            "isFriend" : true
        }, 
        {
            "_id" : ObjectId("5888ca27d79b8b03949a6e8c"),
            "isFriend" : false
        }
    ]
}

感谢您的帮助!

UPD:一种不同的方法(可能更简单),就是使用我拥有的用户ID($ match上使用的用户ID),但我还是需要获取参考跟随者的追随者阵列

db.getCollection('users').aggregate([
    { $match: { _id: ObjectId("588877d82523b4395039910a") } },
    { $lookup: {
            from: 'users',
            localField: 'followers',
            foreignField: '_id',
            as: 's_followers'
        }
    }, {
        $project: {
            "firstName": 1,
            "s_followers._id": 1,
            "s_followers.firstName": 1,
            "s_followers.followers": 1,
            "s_followers.isFriend": { $in: [ObjectId("588877d82523b4395039910a"), "$s_followers.followers"] }
        }
    }
])

UPD2:用户数据结构(重要的部分)

{
  followers: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }],
  friends: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }],
}

2 个答案:

答案 0 :(得分:1)

FOR VERSION 3.4.0 +

好的,刚刚搞定,我会在这里发布代码和我对它的理解:

data=[] parent = driver.find_element_by_id("SearchResultsDetails-MainContent") 
some_objects = parent.find_elements_by_xpath("//li[@class='row oneSearchResult']")
for ob in some_objects:
    data.append(ob.get_attribute("id"))

我对它的理解:

  1. $ match:匹配用户我想要的粉丝。
  2. $ lookup:找到每个关注者详细信息
  3. $ project:选择我想要返回的信息,同时获取每个关注者的关注者列表
  4. $ unwind:为每个关注者创建不同的文档
  5. 在数组未展开的情况下,我可以引用跟随者的追随者数组,并在其中找到我的对象ID:)

答案 1 :(得分:0)

在我的示例中,使用followers friends列表检查当前user朋友。如果想要在{$arrayElemAt:["$s_followers.friends",0]}中找到followers那么可以使用"$s_followers.followers"

你可以尝试一下。

db.getCollection('user').aggregate([
    { $match: { _id: ObjectId("5714d190e6128b7e7f8d9008") } },
    {$unwind:"$followers"},
    { $lookup: {
            from: 'user',
            localField: 'followers',
            foreignField: '_id',
            as: 's_followers'
        }
    },
    {$project:{
        firstName:1,
        s_followers:{$arrayElemAt:["$s_followers",0]},
        isFriend:{$cond:[{
                $anyElementTrue:{
                  $map: {"input": {$arrayElemAt:["$s_followers.friends",0]},
                    "as": "el",
                    "in": { "$eq": [ "$$el", "$_id" ] }
                  }
                }
              },true,false]}
        } 
    },
    {$group:{
        _id:"$_id",
        s_followers:{$push:{_id:"$s_followers._id",isFriend:"$isFriend"}}
        }
    }
])