更新(根据评论):
收藏'文档'如下所示:
[{
_id:ObjectId(someobjectid),
object_data:{
people:[
{id:"b@outlook.com",last_login:"2016-02-10T05:30Z00"},{id:"x@gmail.com",last_login:"2016-02-10T01:30Z00"}
],
comment_body:"Hello this is a comment body and has a lot of text!",
comment_type:"response",
id_deleted: false,
title:"Some title"
},
other_info:"Some other string info",
display_image:"<base64string>",
code:"some_code"
},{
_id:ObjectId(someobjectid),
object_data:{
people:[
{id:"a@gmail.com",last_login:"2016-02-10T05:30Z00"}}
],
comment_body:"Some other comment!",
comment_type:"debate",
id_deleted: false,
title:"Some other title"
},
other_info:"Some other string info",
code:"some_code_not_unique"
}]
现在,我将获得一个电子邮件地址列表作为用户输入的一部分。这些电子邮件是不同数据库和不同集合history
中集合的一部分,其中包含一些其他信息,如下所示:
收藏'历史'结构:
[{
_id:ObjectId(bsonobjectid),
code:'98754654689879',
email:'b@outlook.com',
history:[]
}]
我正在尝试检查documents
集合中是否存在任何文档,其中一个用户输入的电子邮件地址与object_data.people
匹配,并将相同的文档(投影版本)添加到我的history
history
集合aggregate()
设置。
要获取与用户输入电子邮件列表匹配的文档,我在Pymongo中进行emails= ['a@gmail.com','b@outlook.com','c@yahoo.com'] #this list is dynamic and may or may not have a matched documents collection
pipe = [
{
'$match':{
'object_data.people.id': {'$in':emails}
}
},
{
'$project':{
'email':<need the index/value of the matched item in the emails list>,
'object_data':'$object_data',
'code':'$code',
'title':'$object_data.title'
}
}
]
res = db.documents.aggregate(pipe)
:
emails
现在,这会返回一个匹配文档列表,如预期的那样。
问题现在基于bulk_query = db.history.initialize_ordered_bulk_op()
for doc in res:
bulk_query.find({
'code':'some_code',
'email':doc['email'] #value of the matched element (or the index of the item matched will do as I can reconstruct here)
}).update({
'$addToSet':{
'history':doc
}
})
result = leads_bulk_query.execute()
列表中的匹配项我必须在另一个集合中进行批量更新。
有没有办法获得在聚合时匹配的值(或索引)?
我的批量更新将如下所示:
emails
注意:
$unwind
列表并进行匹配
它与python中的聚合响应,结果
聚合可能会非常大。object_data.people.id
并按Current Status: The TXT Records at your DNS Provider do not match the values below.
获取文档并获得所需结果,但同样,我是
寻找在性能方面成本较低的解决方案。提前致谢。希望这有帮助