MongoDB:更新子文档中的特定数组元素

时间:2018-08-09 14:04:40

标签: arrays mongodb find aggregation-framework

我是mongodb的新手,所以如果问题有点基本,请原谅。我有一个具有相对复杂的文档结构的mongo集合。这些文档包含子文档和数组。我需要向此集合中的某些文档中添加其他数据。该文档的简化版本为:

    "date" : ISODate("2018-08-07T08:00:00.000+0000"), 
    .
    . <<-- Other fields
    .
    "basket" : 
   [
     {
            "assetId" : NumberInt(639), 
            "securityId" : NumberInt(12470), 
            .
            . <<-- Other fields
            .
            "exGroup" : [
                . << -- Fields......
                .
                . << -- New Data will go here
            ]
     }
     .
     . << More elements

   ]

以下(简短的)聚合查询查找需要修改的文档:

   { 
        "$match" : {
            "date" : {
                "$gte" : ISODate("2018-08-07T00:00:00.000+0000"), 
                "$lt" : ISODate("2018-08-08T00:00:00.000+0000")
            }
        }
    }, 
    { 
        "$unwind" : {
            "path" : "$basket"
        }
    }, 
    { 
        "$unwind" : {
            "path" : "$basket.exGroup"
        }
    }, 
    { 
        "$project" : {
            "_id" : 1.0, 
            "date" : 1.0, 
            "assetId" : "$basket.assetId", 
            "securityId" : "$basket.securityId", 
            "exGroup" : "$basket.exGroup"
        }
    }, 
    { 
        "$unwind" : {
            "path" : "$exGroup"
        }
    }, 
    { 
        "$match" : {
            "exGroup.order" : {
                "$exists" : true
            }
        }
    }

对于mongo查询返回的每个文档,我需要(在python中)从SQL数据库中检索一组其他数据,然后将此数据附加到原始mongo文档中,如上所示。新字段的集合将相同,数据将不同。对我还不清楚的是,一旦获得数据,我将如何更新数组值。

有人可以给我指点吗?

1 个答案:

答案 0 :(得分:0)

尝试一下,它对我有用!

mySchema.aggregate([
   //your aggregation code
],function(err, docList){
  //for each doc in docList
  async.each(docList, function(doc, callback){
    query = {$and:[{idField:doc.idField},{"myArray.ArrayId":doc.myArray.ArrayId}]}
    //Update or create field in array
    update = {$set:"myArray.$.FieldNameToCreateOrUpdate":value}}
    projection = {field1:1, field2:1, field3:1}
    mySchema.findOneAndUpdate(query, update, projection, function(err, done){
        if(err){callback(err,null)}
        callback(null,'done')
    })
  ,function(err){
    //code if error
    //code if no error
  }
})