获取使用$ match匹配的项目的索引/值 - > $ in aggregate query

时间:2016-03-27 20:00:04

标签: mongodb pymongo aggregation-framework

更新(根据评论):

收藏'文档'如下所示:

[{
    _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

注意:

  1. 我试图避免循环遍历$unwind列表并进行匹配 它与python中的聚合响应,结果 聚合可能会非常大。
  2. 我知道我可以在聚合期间object_data.people.id并按Current Status: The TXT Records at your DNS Provider do not match the values below. 获取文档并获得所需结果,但同样,我是 寻找在性能方面成本较低的解决方案。
  3. 提前致谢。希望这有帮助

0 个答案:

没有答案