如何将MongoDB集合拆分为3并分配新字段?

时间:2016-05-11 20:25:50

标签: mongodb mongodb-query

我有一个包含300条记录的json集合:

{
  salesNumber: 23839,
  batch: null
},
{
  salesNumber 389230,
  batch: null
}
...etc.

我需要将这个集合分成3个不同的批次。因此,当按salesNumber排序时,前100个将是批次1,下一个100将是批次2,最后100个将是批次3.我该怎么做?

我编写了一个脚本来选择前100个,但是当我尝试将其转换为数组以用于更新时,结果是0个记录。

var firstBatchCompleteRecords = db.properties.find(
{
    "auction":  ObjectId("50")
}
).sort("saleNumber").limit(100);
// This returned 174 records as excepted with all the fields

var firstBatch = firstBatchCompleteRecords.distinct( "saleNumber", {});
// This returned 0 records

我将获取最后一个查询的结果并在更新语句中使用它:

db.properties.update(
{
    "saleNumber":
     {
          "$in": firstBatch
    }
}
,
{
    $set: 
        {
            batch: "1"
        }
}
,
{
    multi: true
}
);

...然后我会使用下一个100的不同来创建一个数组并更新它们,但我从来没有那么远。

1 个答案:

答案 0 :(得分:0)

有机会使用聚合框架获得结果 - 并将它们存储在新集合中 - 然后您可以使用this answer来迭代和更新源集合中的字段

玩得开心!

db.sn.aggregate([{
            $sort : {
                salesNumber : 1
            }
        }, {
            $group : {
                _id : null,
                arrayOfData : {
                    $push : "$$ROOT"
                },

            }
        }, {
            $project : {
                _id : 0,
                firstHundred : {
                    $slice : ["$arrayOfData", 0, 100]
                },
                secondHundred : {
                    $slice : ["$arrayOfData", 99, 100]
                },
                thirdHundred : {
                    $slice : ["$arrayOfData", 199, 100]
                },
            }
        }, {
            $project : {
                "firstHundred.batch" : {
                    $literal : 1
                },
                "firstHundred.salesNumber" : 1,
                "firstHundred._id" : 1,

                "secondHundred.batch" : {
                    $literal : 2
                },
                "secondHundred.salesNumber" : 1,
                "secondHundred._id" : 1,

                "thirdHundred.batch" : {
                    $literal : 3
                },
                "thirdHundred.salesNumber" : 1,
                "thirdHundred._id" : 1,
            }
        }, {
            $project : {
                allValues : {
                    $setUnion : ["$firstHundred", "$secondHundred", "$thirdHundred"]
                }
            }
        }, {
            $unwind : "$allValues"
        }, {
            $project : {
                _id : "$allValues._id",
                salesNumber : "$allValues.salesNumber",
                batch : "$allValues.batch",
            }
        }, {
            $out : "collectionName"
        }
    ])

db.collectionName.find()
  

和为6个文档生成的输出除以2:

{
    "_id" : ObjectId("5733ade7eeeccba2bd546121"),
    "salesNumber" : 389230,
    "batch" : 2
}, {
    "_id" : ObjectId("5733ade7eeeccba2bd546120"),
    "salesNumber" : 23839,
    "batch" : 1
}, {
    "_id" : ObjectId("5733ade7eeeccba2bd546122"),
    "salesNumber" : 43839,
    "batch" : 1
}, {
    "_id" : ObjectId("5733ade7eeeccba2bd546124"),
    "salesNumber" : 63839,
    "batch" : 2
}, {
    "_id" : ObjectId("5733ade7eeeccba2bd546123"),
    "salesNumber" : 589230,
    "batch" : 3
}, {
    "_id" : ObjectId("5733ade7eeeccba2bd546125"),
    "salesNumber" : 789230,
    "batch" : 3
}

欢迎任何评论!