我将值存储在多个变量中。下面是输入变量。
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字段为两个变量编写匹配条件?
答案 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