【问题标题】:How to write match condition for array values?如何为数组值编写匹配条件?
【发布时间】:2020-01-19 15:29:37
【问题描述】:

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

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 的文档。

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

【问题讨论】:

    标签: python mongodb aggregation-framework pymongo


    【解决方案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 }}]}}])
    

    或者以我不喜欢的其他方式,因为与 DB 中所有文档的 userid 字段的 n 个值相比,只转换少数代码更容易,但以防万一,如果你想要它是使用数据库查询完成:

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

    注意:如果你没有 bson 包,那么你需要通过类似pip install bson的方式安装它

    【讨论】:

    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多