我最近開始使用Mongo db。 這是蒙戈DB我的樣本文件中DB homeconfig和收集數據PHP Mongo Library沒有更新一些文檔
{
"_id": {},
"user_id": "user",
"rooms": [
{
"name": "abhi",
"metadata": {
"user_id": "user",
"is_expired": "false",
"expired_on": null
}
}
],
"sections": [
{
"name": "section1",
"metadata": {
"user_id": "user",
"room": "abhi",
"is_expired": "false",
"expired_on": null
}
}
],
"devices": [
{
"id": "aur.01.Jpzp0o",
"metadata": {
"section_less": "true",
"label": "aa",
"is_active": null,
"is_loading": null,
"is_dimmable": null,
"type": "aura",
"sub_device": "aur.01",
"is_favourite": "false",
"dimming": null,
"energy_usage": 0,
"usage_today": 0,
"avg_usage": 0,
"ir_control": null,
"user_id": "user",
"room": "abhi",
"section": null,
"is_expired": "false",
"expired_on": null
}
}
]
}
上面顯示的JSON只是我的文檔的例子。實際的相當大,我不能透露原件。
下面是我用來更新文檔中的集合的函數。
function removeSectionsFromMongo($user_id, $data, $date)
{
$collection = (new MongoConnect())->connect('homeconfig', 'data');
foreach ($data as $key) {
$update = $collection->updateOne(['user_id'=>$user_id, 'sections' => ['$elemMatch' => ['name' => $key['name'], 'metadata.is_expired' => 'false' ]]],
['$set'=>['sections.$.metadata.is_expired'=>'true', 'sections.$.metadata.expired_on'=>$date]]
);
if($update->getModifiedCount() == 1)
{
echo "Section <".$key['name']."> removed from room <".$key['metadata']['room'].">."."\n";
}
}
}
可變$data
低於所示的陣列:
Array
(
[0] => Array
(
[name] => Appliances
[metadata] => Array
(
[user_id] => CubicalPrime
[room] => Dhruv
[is_expired] => false
[expired_on] =>
)
)
[1] => Array
(
[name] => Bathroom
[metadata] => Array
(
[user_id] => CubicalPrime
[room] => Dhruv
[is_expired] => false
[expired_on] =>
)
)
[2] => Array
(
[name] => Others
[metadata] => Array
(
[user_id] => CubicalPrime
[room] => Dhruv
[is_expired] => false
[expired_on] =>
)
)
)
當我執行的功能,它應該更新所有sections
傳入的陣列$data
在我的文檔匹配。
但是,它正在更新文檔。但是,當文檔大小增加時,sections
中的某些對象有時不會更新。即is_expired
字段沒有更新到true
& expired_on
在通過的日期沒有更新。
當我再次運行相同的函數時,整個更新發生在第二次。
我只在查詢結果表明修改計數等於1時纔回顯。這表示查詢正在正確執行。但很少有文件沒有得到更新。
if($update->getModifiedCount() == 1)
{
echo "Section <".$key['name']."> removed from room <".$key['metadata']['room'].">."."\n";
}
我想弄清楚爲什麼文件沒有在第一時間得到更新,但第二次得到更新!
幫我看看我的代碼出了什麼問題?
同樣的問題仍然存在。很少有結果沒有得到更新。這些與以前的實施完全相同。 ;-( – Choxx
查看我的答案,我添加了幾個驗證參數,代碼工作起來就像一個魅力一樣,並且我更新了我的代碼,按照您的建議使用'bulkwrite()'。 – Choxx