0

私は次のMongoDBオブジェクトを持っています:

 {
   "_id": ObjectId("508ec9f413f88da4a590e5ee"),
   "beersAndStouts": {
     "0": {
       "description": "Guinness",
       "price": "4.20"
    },
     "1": {
       "description": "Heineken",
       "price": "4.80"
    },
     "2": {
       "description": "Carlsberg",
       "price": "4.80"
    }
  },
   "snacks": {
     "0": {
       "description": "King cheese and onion",
       "price": "2.20"
    },
     "1": {
       "description": "Tayto cheese and onion",
       "price": "1.80"
    }
  },
   "specialOffers": {
     "0": {
       "description": "Two for one vodka\/red bull",
       "price": "8"
    }
  },
   "uname": "Eamorr",
   "wines": {
     "0": {
       "description": "Cabernet Sauvignon",
       "price": "5.00"
    },
     "1": {
       "description": "Chardonnay",
       "price": "5.00"
    }
  }
}   

そして私は次のPHP変数を持っています:

$category=$_POST['category'];   //"beersAndStouts"
$description=$_POST['columnName'];   //"Description"
$value=$_POST['value'];   //"4.70"
$rowId=$_POST['rowId'];   //2

Carlsberg(rowId = 2)の価格を4.80から4.70に変更したい...

そのようなクエリを実行する方法は?

これが私がソファを持っているものです、しかし私は今本当に立ち往生しています...

$priceLists=$mongo->eamorr->priceLists;
$priceLists->update(array('uname'=>$uname),array('$set'=>array($category=>array($rowId=>xxx))));

更新:これが私が使用したコードです:

$mongo=new Mongo();
$priceLists=$mongo->eamorr->priceLists;

$priceList=$priceLists->findOne(array('uname'=>$uname));

$newCategory=$priceList[$category];
$newCategory[$rowId][$description]=$value;

$priceLists->update(array('uname'=>$uname),array('$set'=>array($category=>$newCategory)));

きれいではありませんが、機能し、構造を変更する必要はありません。

4

1 に答える 1

2

なぜそれがオブジェクトのオブジェクトである必要があるのですか?オブジェクトの配列で置き換えることができ、そのような場合は問題なく機能します。アイデアは次のとおりです。

{
  "_id" : ObjectId("508ec9f413f88da4a590e7ee"),
  "beersAndStouts" : [{
      "description" : "Guinness",
      "price" : "4.20"
    }, {
      "description" : "Heineken",
      "price" : 6666
    }, {
      "description" : "Carlsberg",
      "price" : "4.80"
    }],
  "snacks" : [{
      "description" : "King cheese and onion",
      "price" : "2.20"
    }, {
      "description" : "Tayto cheese and onion",
      "price" : "1.80"
    }],
  "specialOffers" : [{
      "description" : "Two for one vodka/red bull",
      "price" : "8"
    }],
  "uname" : "Eamorr",
  "wines" : [{
      "description" : "Cabernet Sauvignon",
      "price" : "5.00"
    }, {
      "description" : "Chardonnay",
      "price" : "5.00"
    }]
}

そして、そのような場合のクエリは単純です:

db.test.update({
   "_id" : ObjectId("508ec9f413f88da4a590e7ee"),
   "beersAndStouts.description" : "Carlsberg"
},{
  '$set' : {
  'beersAndStouts.$.price' :  4.70
}
});

ObjectIdを変更したことを覚えておいてください!

これをmongoシェルに入れると、機能します。

phpに調整するのは明らかだと思います。

于 2012-11-02T12:23:11.440 に答える