C# 如何在MongoDB中保存MapReduce结果?
我有两个收藏:PriceShop(ShopId,Price,DrugId),Druge(DrugId,MaxPrice,MinPrice) 我使用map/reduce查找PriceShop集合中相同药物的maxPrice、minPrice,然后使用map/reduce结果更新药物集合 但在MongoDb 2.4中,我不能再在map或reduce函数中使用“db.Drug.Update”,那么还有其他解决方案可以做到这一点吗。这是我的map/reduce代码: db.PriceShop.MapReduce(map,reduce)C# 如何在MongoDB中保存MapReduce结果?,c#,mongodb,mapreduce,mongodb-.net-driver,nosql,C#,Mongodb,Mapreduce,Mongodb .net Driver,Nosql,我有两个收藏:PriceShop(ShopId,Price,DrugId),Druge(DrugId,MaxPrice,MinPrice) 我使用map/reduce查找PriceShop集合中相同药物的maxPrice、minPrice,然后使用map/reduce结果更新药物集合 但在MongoDb 2.4中,我不能再在map或reduce函数中使用“db.Drug.Update”,那么还有其他解决方案可以做到这一点吗。这是我的map/reduce代码: db.PriceShop.MapRe
函数映射(){
发出(这个药){
“计数”:0.5,
“maxprice”:这个价格,
“minprice”:这个价格,
“stateid”:这个.State
});
发出(这个药){
“计数”:0.5,
“maxprice”:这个价格,
“minprice”:这个价格,
“stateid”:这个.State
});
}
功能减少(键、arr_值){
var计数=0;
var maxprice=0;
var-minprice=0;
var drugItem=db.druge.findOne({
“_id”:密钥
});
arr_值。forEach(功能(项目){
如果(项目[“stateid”]==0){
计数+=项目[“计数”];
如果(项目[“maxprice”]>maxprice&&item[“maxprice”]>0){
maxprice=项目[“maxprice”];
}
如果(最小价格==0){
minprice=项目[“minprice”];
}否则如果(项目[“minprice”]>0和项目[“minprice”]
}是否需要重构代码,以便Reduce的输出就是您在集合中设置的输出?(我很惊讶在MapReduce中删除对集合的写入功能花费了10gen这么长的时间。)@WiredPairie可能是我可以直接“renturn{“MaxStorePrice”:MaxStorePrice,“MinStorePrice”:MinStorePrice,“PriceShopCount”:PriceShopCount},然后如何更新它,我需要使用“foreach”吗要枚举输出和更新中的每个项目?或者只是更新输出?你能把MapReduce调用的
out
设置为一个新集合并在那里收集结果吗?@wiredparie-Hmm,也许不是,实际上现在我已经设置了一个集合“keeptempriceshop”,但它对文档的评分如下:{u id:1,值:{“MaxStorePrice”:MaxStorePrice,“MinStorePrice”:MinStorePrice,“PriceShopCount”:PriceShopCount}},但我的最终目的是更新药品收集。也许这是一个糟糕的设计,我走错了方向,然后告诉我,谢谢。
function Map() {
emit(this.Drugid, {
"count" : 0.5,
"maxprice" : this.Price,
"minprice" : this.Price,
"stateid" : this.State
});
emit(this.Drugid, {
"count" : 0.5,
"maxprice" : this.Price,
"minprice" : this.Price,
"stateid" : this.State
});
}
function Reduce(key, arr_values) {
var count = 0;
var maxprice = 0;
var minprice = 0;
var drugItem = db.drug.findOne({
"_id" : key
});
arr_values.forEach(function (item) {
if (item["stateid"] == 0) {
count += item["count"];
if (item["maxprice"] > maxprice && item["maxprice"] > 0) {
maxprice = item["maxprice"];
}
if (minprice == 0) {
minprice = item["minprice"];
} else if (item["minprice"] > 0 && item["minprice"] < minprice) {
minprice = item["minprice"];
}
}
});
var MaxStorePrice = 0;
var MinStorePrice = 0;
var PriceShopCount = 0;
if (drugItem != null && drugItem["MaxStorePrice"] != null) {
MaxStorePrice = drugItem["MaxStorePrice"];
}
if (drugItem != null && drugItem["MinStorePrice"] != null) {
MinStorePrice = drugItem["MinStorePrice"];
}
if (drugItem != null && drugItem["PriceShopCount"] != null) {
PriceShopCount = drugItem["PriceShopCount"];
}
if (MaxStorePrice != maxprice || MinStorePrice != minprice || PriceShopCount != count) {
db.drug.update({
"_id" : key
}, {
"$set" : {
"MaxStorePrice" : maxprice,
"MinStorePrice" : minprice,
"PriceShopCount" : NumberInt(count)
}
});
}
return {
"count" : count,
"maxprice" : maxprice,
"minprice" : minprice,
"MaxStorePrice" : MaxStorePrice,
"MinStorePrice" : MinStorePrice,
"PriceShopCount" : PriceShopCount
};