1

我是 mongodb 的初学者。

我需要删除每家商店的最低价格。

文件(产品):

输入:

product_id|store_id|price|color|
--------------------------------
1         |   1    | 10  |red
2         |   1    | 9   |blue
3         |   1    | 12  |red
4         |   2    | 19  |red
5         |   2    | 20  |red
6         |   2    | -1  |red
7         |   6    | 30  |red
8         |   6    | 10  |blue

输出:

product_id|store_id|price|color|
--------------------------------
2         |   1    | 9   |blue
3         |   1    | 12  |red
4         |   2    | 19  |red
5         |   2    | 20  |red
8         |   6    | 10  |blue

我在 my.js 中编写此代码

use stores;
var products=db.products.distinct('product_id');
for(i=0; i<products.length; i++){
   db.products.remove({product_id:i,color:'red'}).sort({price:1}).limit(1);
}

但是我的代码不起作用,请写更好的代码或显示我的错误/

谢谢

4

4 回答 4

3

您可能想尝试:

// this returns an array of documents which has the store_id and the minimum price for that store
myresult = db.products.aggregate( [ 
                            { $group: 
                                 { _id: "$store_id", 
                                   price: { $min: "$price" } 
                                 } 
                            } 
                            ] ).result

// loop through the results to remove the documents matching the the store id and price

for (i in myresult) { 
    db.products.remove( 
         { store_id: myresult[i]._id, price: myresult[i].price } 
    ); 
}
于 2012-11-08T22:46:42.103 回答
2

对我来说,您的代码似乎很好。只是想知道您想通过 store_id 查找,然后根据颜色删除最低价格产品。

在 mongodb findAndModify()中有一个直接的方法,它默认查找和修改单个文档。

http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/#findandmodify-wrapper-sorted-remove

var products=db.products.distinct('store_id');
products.forEach(function(storeId, i){
    db.products.findAndModify({
        query: { "store_id":storeId, "color": "red" }, 
        sort: { price:  1 }, 
        remove: true});
});
于 2014-09-20T20:04:32.473 回答
2

您的代码几乎是正确的,只需要进行一些修改:

use stores;
var products = db.products.distinct('product_id');
products.forEach(function(i, v){
    var id = db.products.find({product_id: v, color: "red"}).sort({price: 1}).limit(1).toArray()[0];
    db.products.remove({_id: id._id}); 
});
于 2014-09-20T14:26:17.273 回答
0

这个答案适用于搜索“如何删除 mongodb 中的最小值?”的人。

var myresult = db.mycol.aggregate
([{
    $group:
    {
       _id:"",
       agevalue: { $min: "$age" }
    }
   
}]);
db.mycol.remove( {"age": myresult._batch[0].agevalue})

您可以将列名称分配给_id. 然后查询将根据该列对结果进行分组。然后,您可以为每个组设置多个最小值。

于 2017-03-08T14:09:27.293 回答