如何写匹配条件的数组值?

时间:2019-09-18 15:59:04

标签: python mongodb aggregation-framework pymongo

我将值存储在多个变量中。下面是输入变量。

uid = Objectid("5d518caed55bc00001d235c1")
disuid = ['5d76b2c847c8d3000184a090', '5d7abb7a97a90b0001326010']

这些值是动态更改的。下面是我的代码:

user_posts.aggregate([{
    "$match": {
        "$or": [{ "userid": uid }, {
            "userid": {
                "$eq":
                    disuid
            }
        }]
    }
},
{
    "$lookup": {
        "from": "user_profile",
        "localField": "userid",
        "foreignField": "_id",
        "as": "details"
    }
},
{ "$unwind": "$details" },
{
    "$sort": { "created_ts": -1 }
},
{
    "$project": {
        "userid": 1,
        "type": 1,
        "location": 1,
        "caption": 1
    }
}
])

在上面的代码中,我只获得了匹配的 uid 值,但是我还需要匹配到 disuid 的文档。

用户ID 字段中,我们仅存储了“对象ID”值。 所以我关心的是如何在“ disuid”变量中添加“ Objectid”,以及如何使用userid字段为两个变量编写匹配条件?

1 个答案:

答案 0 :(得分:1)

好的,您可以通过两种方式做到这一点:

有了这个:

uid = Objectid("5d518caed55bc00001d235c1")
disuid = ['5d76b2c847c8d3000184a090', '5d7abb7a97a90b0001326010']

您需要使用python代码将字符串列表转换为ObjectId的列表:

from bson.objectid import ObjectId


disuid = ['5d76b2c847c8d3000184a090', '5d7abb7a97a90b0001326010']
my_list = []


for i in disuid:
    my_list.append(ObjectId(i))

它看起来像这样: [ObjectId('5d76b2c847c8d3000184a090'),ObjectId('5d7abb7a97a90b0001326010')]

然后使用新列表my_list,您可以像这样进行查询:

user_posts.aggregate([{"$match" : { "$or" : [{ "userid" : uid }, { "userid" : { "$in" : my_list }}]}}])

或者用我不喜欢的另一种方式,因为与数据库中所有文档中userid字段的n个值相比,转换很少的代码会更容易,但万一您愿意使用数据库查询即可完成:

user_posts.aggregate([{$addFields : {userStrings : {$toString: '$userid'}}},{"$match" : { "$or" : [{ "userid" : uid }, { "userStrings" : { "$in" : disuid }}]}}])

注意::如果您没有bson软件包,则需要通过类似pip install bson

的方式进行安装