sql >> データベース >  >> NoSQL >> MongoDB

mongoengineに埋め込まれたドキュメントのリストを更新する

    いいえ、リストフィールドでは、1回のクエリでリストにアップサートすることはできません。 $addToSet postを変更したため、機能しません だからあなたは一致することはできません。これをコード化することはできますが、エラーが発生する可能性のある小さなウィンドウがある競合状態が作成されます。例:

        class Post(EmbeddedDocument):
            uid = StringField(required=True)
            text = StringField(required=True)
    
        class Feed(Document):
            label = StringField(required=True)
            feed_url = StringField(required=True)
            posts = ListField(EmbeddedDocumentField(Post))
    
        Feed.drop_collection()
    
        Feed(
            label="label",
            feed_url="www.feed.com"
        ).save()
    
        post = Post(uid='1', text="hi")
        updated = Feed.objects(posts__uid=post.uid).update_one(set__posts__S=post)
        if not updated:
            Feed.objects.update_one(push__posts=post)
    

    最初に更新を試み、それが存在しない場合はリストにプッシュします。これは、別のプロセスを実行してpostをプッシュする機会がある場所です。 リストに載っています。

    リスクは許容できるかもしれませんが、現実的には、スキーマを変更する方が良いと思います。Postを分割する可能性があります。 独自のコレクションに。次に、updateステートメントを使用して、オブジェクト全体を設定できます。費用は、フィードデータを取得するための追加のクエリになります。



    1. MongoDB-複数の行を集約

    2. Node.jsMongoose.js文字列からObjectId関数へ

    3. Jacksonを使用したJavaMongoDBObjectとの間の効率的なPOJOマッピング

    4. EC2環境でnode-mongodb-nativeを使用してNode.jsサーバーにMongoDBを設定するにはどうすればよいですか?