MongoDB数组修改器更新数据

Jun 07, 2016 pm 02:58 PM
mongodb 修飾子 データ 配列 更新する

MongoDB数组修改器更新数据 这里,我们将了解一下数组修改器。数组,是我们经常看到和使用到的且非常有用的数据结构:它不仅可以通过索进行引用,还可以作为集合来使用。数组修改器,顾名思义,它是用来修改数组的,而不能用来修改整数或者字符串。数组修改

MongoDB数组修改器更新数据

 

   这里,我们将了解一下数组修改器。数组,是我们经常看到和使用到的且非常有用的数据结构:它不仅可以通过索进行引用,还可以作为集合来使用。数组修改器,顾名思义,它是用来修改数组的,而不能用来修改整数或者字符串。数组修改器不多,就那么几个,但熟练掌握它后,将给我们带来非常方便的操作。下面,我们来了解一下:

> db.user.findOne()

{

    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

    "age" : 23,

    "favorite" : {

        "1" : "reading",

        "2" : "swimming",

        "3" : "listening music"

    },

    "fname" : "jeff",

    "height" : 166,

    "lname" : "jiang",

    "relationships" : [

        {

            "fname" : "deng",

            "lname" : "pan"

        },

        {

            "fname" : "qiang",

            "lname" : "he"

        },

        {

            "fname" : "dongren",

            "lname" : "zeng"

        }

    ]

}

以上是我的还在完善中的个人信息文档。假设最近我又交了一个好朋友,我想把他加到我的人际关系“relationships”数组中。这时,$push修改器就派上用场了。$push的作用就是,如果指定的键已经存在,它会向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组。下面我们把新朋友加进去。

> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$push:{"relationships":{"fname":"xiong","lname":"lan"}}})

> db.user.findOne()

{

    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

    "age" : 23,

    "favorite" : {

        "1" : "reading",

        "2" : "swimming",

        "3" : "listening music"

    },

    "fname" : "jeff",

    "height" : 166,

    "lname" : "jiang",

    "relationships" : [

        {

            "fname" : "deng",

            "lname" : "pan"

        },

        {

            "fname" : "qiang",

            "lname" : "he"

        },

        {

            "fname" : "dongren",

            "lname" : "zeng"

        },

        {

            "fname" : "xiong",

            "lname" : "lan"

        }

    ]

}

有加就有减,那么怎么对数组进行“减”操作呢。能达到对数组“减”目的的修改器有两个,$pop和$pull。$pop和$pull又有区别,我们来分别实验。首先是$pop

> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$pop:{"relationships":1}})

> db.user.findOne()

{

    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

    "age" : 23,

    "favorite" : {

        "1" : "reading",

        "2" : "swimming",

        "3" : "listening music"

    },

    "fname" : "jeff",

    "height" : 166,

    "lname" : "jiang",

    "relationships" : [

        {

            "fname" : "deng",

            "lname" : "pan"

        },

        {

            "fname" : "qiang",

            "lname" : "he"

        },

        {

            "fname" : "dongren",

            "lname" : "zeng"

        }

    ]

}

从上面可以看出,它把我们刚加进去的朋友又删除了,也就是说它从数组的最后删除。那么,如果我们想从数组的开头删除该怎么办呢。很简单,把上面的“1”改成“-1”,它将逆向操作。下面看一下:

> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$pop:{"relationships":-1}})

> db.user.findOne()

{

    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

    "age" : 23,

    "favorite" : {

        "1" : "reading",

        "2" : "swimming",

        "3" : "listening music"

    },

    "fname" : "jeff",

    "height" : 166,

    "lname" : "jiang",

    "relationships" : [

        {

            "fname" : "qiang",

            "lname" : "he"

        },

        {

            "fname" : "dongren",

            "lname" : "zeng"

        }

    ]

}

从结果可以看出,它达到了我们预期的目的。那么如果我们想删除数组中间的呢。这时,$pull派上用场。首先,我们先将新朋友加进去,这里我不再演示。但我们可以想到“dongren”这个人是在数组的中间。现在我们要将他删除:

> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$pull:{"relationships":{"fname":"dongren","lname":"zeng"}}})

> db.user.findOne()

{

    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

    "age" : 23,

    "favorite" : {

        "1" : "reading",

        "2" : "swimming",

        "3" : "listening music"

    },

    "fname" : "jeff",

    "height" : 166,

    "lname" : "jiang",

    "relationships" : [

        {

            "fname" : "qiang",

            "lname" : "he"

        },

        {

            "fname" : "xiong",

            "lname" : "lan"

        }

    ]

}

从上面可以看出,$pull可以将数组中间的数据删除。这里还有一点要注意,$pull会将所有匹配到的数据都删除,这里我就不做实验了。下面,我们再来看看$push还有什么特点,我们再往数组里插入一相同的数据,看看会如何:

> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$push:{"relationships":{"fname":"xiong","lname":"lan"}}})

> db.user.findOne()

{

    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

    "age" : 23,

    "favorite" : {

        "1" : "reading",

        "2" : "swimming",

        "3" : "listening music"

    },

    "fname" : "jeff",

    "height" : 166,

    "lname" : "jiang",

    "relationships" : [

        {

            "fname" : "qiang",

            "lname" : "he"

        },

        {

            "fname" : "xiong",

            "lname" : "lan"

        },

        {

            "fname" : "xiong",

            "lname" : "lan"

        }

    ]

}

结果表明,它是能正常插入到数组的。而在实际生产环境中,我们都不想看到这样的结果,那么,这里又出现了两个可以用的修改器:$ne和$addToSet。$ne主要拿来判断,若数组里面有这个值,则不插入;没有才插入。

> db.user.update({"relationships.fname":{$ne:"xiong"}},{$set:{"fname":"xiong","lname":"lan"}})

> db.user.findOne()

{

    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

    "age" : 23,

    "favorite" : {

        "1" : "reading",

        "2" : "swimming",

        "3" : "listening music"

    },

    "fname" : "jeff",

    "height" : 166,

    "lname" : "jiang",

    "relationships" : [

        {

            "fname" : "qiang",

            "lname" : "he"

        },

        {

            "fname" : "xiong",

            "lname" : "lan"

        },

        {

            "fname" : "xiong",

            "lname" : "lan"

        }

    ]

}

由结果可以看出,由于该数据在数组中已经存在,所以不再插入。其实,$addToSet比$ne更好用,它可以自己判断数据是否存在,而且它和$each结合使用,还能同时在数组中插入多个数据,这是$ne没办法办到的,下面我们来看一下$addToSet的用法,这里顺便结合了$each的使用:

> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},

{$addToSet:{"relationships":{$each:[{"fname":"xiong","lname":"lan"},

{"fname":"dongren","lname":"zeng"}]}}})

> db.user.findOne()

{

    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

    "age" : 23,

    "favorite" : {

        "1" : "reading",

        "2" : "swimming",

        "3" : "listening music"

    },

    "fname" : "jeff",

    "height" : 166,

    "lname" : "jiang",

    "relationships" : [

        {

            "fname" : "qiang",

            "lname" : "he"

        },

        {

            "fname" : "xiong",

            "lname" : "lan"

        },

        {

            "fname" : "xiong",

            "lname" : "lan"

        },

        {

            "fname" : "dongren",

            "lname" : "zeng"

        }

    ]

}

在修改语句中,我们想同时插入{"fname":"xiong","lname":"lan"},

{"fname":"dongren","lname":"zeng"}两个数据,但在原数组中,

{"fname":"xiong","lname":"lan"}这个数据已经存在,所以它只插入了后面那条。达到了我们想要的目的。所以,我个人更喜欢使用$addToSet。

    有时候数组有多个值,而我们只想对其中的一部分进行操作。如果我们把整个文档都抄下来,那太麻烦也太愚蠢了。好在mongodb给我们提供了两种简便方法:通过位置或者操作符“$”。下面我们来分别看看这两种方法怎么使用。首先是通过数组位置来操作。数组都是以0开头的,可以将下标直接作为键来选择元素。例如,我们想给数组的第一个数据加上年龄键值对,我们可以这么操作:

> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$set:{"relationships.0.age":22}})

> db.user.findOne()

{

    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

    "age" : 23,

    "favorite" : {

        "1" : "reading",

        "2" : "swimming",

        "3" : "listening music"

    },

    "fname" : "jeff",

    "height" : 166,

    "lname" : "jiang",

    "relationships" : [

        {

            "age" : 22,

            "fname" : "qiang",

            "lname" : "he"

        },

        {

            "fname" : "deng",

            "lname" : "pan"

        },

        {

            "fname" : "xiong",

            "lname" : "lan"

        }

    ]

}

可是很多情况下,不预先查询文档我们就不知道要修改数组的元素的下标。这时定位操作符“$”就很好用了。它就是用来定位查询文档已匹配的元素,并进行更新。我们来看看它怎么用:

> db.user.update({"relationships.fname":"xiong"},{$set:{"relationships.$.age":22}})

> db.user.findOne()

{

    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

    "age" : 23,

    "favorite" : {

        "1" : "reading",

        "2" : "swimming",

        "3" : "listening music"

    },

    "fname" : "jeff",

    "height" : 166,

    "lname" : "jiang",

    "relationships" : [

        {

            "age" : 22,

            "fname" : "qiang",

            "lname" : "he"

        },

        {

            "age" : 22,

            "fname" : "deng",

            "lname" : "pan"

        },

        {

            "age" : 22,

            "fname" : "xiong",

            "lname" : "lan"

        }

    ]

}

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

アメリカ空軍が初のAI戦闘機を公開し注目を集める!大臣はプロセス全体を通じて干渉することなく個人的にテストを実施し、10万行のコードが21回にわたってテストされました。 アメリカ空軍が初のAI戦闘機を公開し注目を集める!大臣はプロセス全体を通じて干渉することなく個人的にテストを実施し、10万行のコードが21回にわたってテストされました。 May 07, 2024 pm 05:00 PM

最近、軍事界は、米軍戦闘機が AI を使用して完全自動空戦を完了できるようになったというニュースに圧倒されました。そう、つい最近、米軍のAI戦闘機が初めて公開され、その謎が明らかになりました。この戦闘機の正式名称は可変安定性飛行シミュレーター試験機(VISTA)で、アメリカ空軍長官が自ら飛行させ、一対一の空戦をシミュレートした。 5 月 2 日、フランク ケンダル米国空軍長官は X-62AVISTA でエドワーズ空軍基地を離陸しました。1 時間の飛行中、すべての飛行動作が AI によって自律的に完了されたことに注目してください。ケンダル氏は「過去数十年にわたり、私たちは自律型空対空戦闘の無限の可能性について考えてきたが、それは常に手の届かないものだと思われてきた」と語った。しかし今では、

テスラのロボットは工場で働く、マスク氏:手の自由度は今年22に達する! テスラのロボットは工場で働く、マスク氏:手の自由度は今年22に達する! May 06, 2024 pm 04:13 PM

テスラのロボット「オプティマス」の最新映像が公開され、すでに工場内で稼働可能となっている。通常の速度では、バッテリー(テスラの4680バッテリー)を次のように分類します:公式は、20倍の速度でどのように見えるかも公開しました - 小さな「ワークステーション」上で、ピッキング、ピッキング、ピッキング:今回は、それがリリースされたハイライトの1つビデオの内容は、オプティマスが工場内でこの作業を完全に自律的に行​​い、プロセス全体を通じて人間の介入なしに完了するというものです。そして、オプティマスの観点から見ると、自動エラー修正に重点を置いて、曲がったバッテリーを拾い上げたり配置したりすることもできます。オプティマスのハンドについては、NVIDIA の科学者ジム ファン氏が高く評価しました。オプティマスのハンドは、世界の 5 本指ロボットの 1 つです。最も器用。その手は触覚だけではありません

Windows は指定されたデバイス、パス、またはファイルにアクセスできません Windows は指定されたデバイス、パス、またはファイルにアクセスできません Jun 18, 2024 pm 04:49 PM

友人のコンピュータにはこのような障害があり、「この PC」と C ドライブのファイルを開くと、「Explorer.EXE Windows は指定されたデバイス、パス、またはファイルにアクセスできません。プロジェクトにアクセスするための適切な権限がない可能性があります。」と表示されます。フォルダ、ファイル、このコンピュータ、ごみ箱などを含め、ダブルクリックするとこのようなウィンドウが表示されますが、通常は右クリックで開きます。システムのアップデートが原因でこの状況が発生した場合は、以下のエディターで解決方法を説明します。 1. レジストリ エディターを開いて Win+R と入力し、「regedit」と入力するか、スタート メニューを右クリックして実行し、「regedit」と入力します。 2. レジストリ「Computer\HKEY_CLASSES_ROOT\PackagedCom\ClassInd」を見つけます。

Windows が更新を永久に一時停止し、Windows が自動更新をオフにする Windows が更新を永久に一時停止し、Windows が自動更新をオフにする Jun 18, 2024 pm 07:04 PM

Windows アップデートにより、次の問題が発生する可能性があります。 1. 互換性の問題: 一部のアプリケーション、ドライバー、またはハードウェア デバイスは、新しい Windows アップデートと互換性がなく、適切に動作しなかったり、クラッシュしたりする可能性があります。 2. パフォーマンスの問題: Windows アップデートにより、システムが遅くなったり、パフォーマンスが低下したりする場合があります。これは、新機能または改善により、実行するためにより多くのリソースが必要になることが原因である可能性があります。 3. システムの安定性の問題: 一部のユーザーは、Windows 更新プログラムをインストールした後、システムで予期しないクラッシュやブルー スクリーン エラーが発生する可能性があると報告しました。 4. データ損失: まれに、Windows アップデートによりデータ損失やファイル破損が発生する場合があります。このため、重要な更新を行う前に、バックアップを作成してください。

AI スタートアップ企業は一斉に OpenAI に転職し、イリヤが去った後にセキュリティ チームが再編成されました。 AI スタートアップ企業は一斉に OpenAI に転職し、イリヤが去った後にセキュリティ チームが再編成されました。 Jun 08, 2024 pm 01:00 PM

先週、社内の辞任と社外からの批判が相次ぐ中、OpenAIは内外のトラブルに見舞われた。 - 未亡人姉妹への侵害が世界中で白熱した議論を巻き起こした - 「覇権条項」に署名した従業員が次々と暴露 - ネットユーザーがウルトラマンの「」をリストアップ噂の払拭: Vox が入手した漏洩情報と文書によると、アルトマンを含む OpenAI の上級幹部はこれらの株式回収条項をよく認識しており、承認しました。さらに、OpenAI には、AI セキュリティという深刻かつ緊急の課題が直面しています。最近、最も著名な従業員2名を含むセキュリティ関連従業員5名が退職し、「Super Alignment」チームが解散したことで、OpenAIのセキュリティ問題が再び注目を集めている。フォーチュン誌は OpenA を報じた。

70B モデルは数秒で 1,000 トークンを生成、コード書き換えは GPT-4o を超える、OpenAI が投資したコード成果物である Cursor チームによる 70B モデルは数秒で 1,000 トークンを生成、コード書き換えは GPT-4o を超える、OpenAI が投資したコード成果物である Cursor チームによる Jun 13, 2024 pm 03:47 PM

70B モデルでは、数秒で 1,000 個のトークンを生成でき、これはほぼ 4,000 文字に相当します。研究者らは Llama3 を微調整し、高速化アルゴリズムを導入しました。ネイティブ バージョンと比較して、速度は 13 倍高速になりました。速いだけでなく、コード書き換えタスクのパフォーマンスは GPT-4o をも上回ります。この成果は、人気の AI プログラミング成果物 Cursor を開発したチーム、anysphere によるもので、OpenAI も投資に参加しました。有名な高速推論アクセラレーション フレームワークである Groq では、70BLlama3 の推論速度は 1 秒あたり 300 トークンを超える程度であることを知っておく必要があります。 Cursor の速度により、ほぼ瞬時に完全なコード ファイル編集を実現すると言えます。カースと言うと良い奴だと言う人もいる

58 行のコードは Llama 3 から 100 万コンテキストまで拡張可能、あらゆる微調整バージョンが適用可能 58 行のコードは Llama 3 から 100 万コンテキストまで拡張可能、あらゆる微調整バージョンが適用可能 May 06, 2024 pm 06:10 PM

Llama3 はオープンソースの堂々たる王様ですが、オリジナルのコンテキスト ウィンドウはわずか... 8k で、「とても良い匂いがする」という言葉を飲み込みました。現在、32k が開始点であり、100k が一般的ですが、これはオープンソース コミュニティへの貢献の余地を残す意図があるのでしょうか?オープンソース コミュニティは確かにこの機会を逃しませんでした。わずか 58 行のコードで、Llama370b の微調整されたバージョンは自動的に 1048k (100 万) コンテキストに拡張できるようになりました。舞台裏には、適切なコンテキストを拡張する Llama370BInstruct の微調整バージョンから抽出された LoRA があり、ファイルはわずか 800 MB です。次に、Mergekit を使用すると、同じアーキテクチャの他のモデルで実行したり、モデルに直接マージしたりできます。 1048k コンテキストが使用される

チャイナモバイル:人類は第4次産業革命を迎え、「3つの計画」を正式発表 チャイナモバイル:人類は第4次産業革命を迎え、「3つの計画」を正式発表 Jun 27, 2024 am 10:29 AM

6月26日のニュースによると、2024年世界移動通信会議上海(MWC上海)の開会式で、チャイナモバイル会長の楊潔氏がスピーチを行った。現在、人類社会は情報が支配し、情報とエネルギーが深く融合する第4次産業革命、すなわち「デジタルインテリジェンス革命」を迎えており、新たな生産力の形成が加速していると述べた。楊潔氏は、蒸気機関による「機械化革命」から、電気や内燃機関による「電化革命」、コンピューターやインターネットによる「情報革命」に至るまで、各段階の産業革命は、 「情報」と「エネルギー」が生産性向上をもたらす幹線

See all articles