MongoDB、複数のレベルのドット表記を持つ既存の埋め込みドキュメントに新しい{field:value}を追加しますか?

私がしようとしているのは、新しい{field:value}をブログ記事に追加することです。たとえば、websites.blog_posts.url: 'http://www.example.com/01.html'でインプレッションのトラッキングを開始する場合、そのブログ記事のインプレッション属性を追加するにはどうすればよいですか?

私の現在の文書構造:

{ 
email_address: '[email protected]', 
password: 'random_password',
first_name: 'John',
last_name: 'Doe',
user_type: 'WEBMASTER',
newsletter: 'NO',
websites: [{
    main_title: 'My Blog Website',
    main_url: 'http://www.example.com',
        blog_posts: [{
            url: 'http://www.example.com/01.html',
            title:'My first blog post',
            description: 'My first description.'
        }, { 
            url: 'http://www.example.com/02.html',
            title: 'My second blog post',
            description: 'My second description.'
        }, { 
            url: 'http://www.example.com/03.html',
            title: 'My third blog post',
            description: 'My third description.'
        }, { 
            url: 'http://www.example.com/04.html',
            title: 'My fourth blog post',
            description: 'My fourth description.'
        }]
    }]
}

ここで私は更新を使ってうまく動作し、upsert TRUEを作ると思ったものです。

db.my_collection.update({'websites.blog_posts.url': 'http://www.example.com/01.html'}、{'$ set':{'websites.blog_posts.impressions': 549}}、true)

The error that I received is: *can't append to array using string field name [blog_posts]*

たぶん "$ set"はこれには正しくないかもしれませんし、ドット表記でその深みを参照することはできませんか?私は昨日MongoDBを使い始めました。どんな助けも素晴らしいでしょう。

ありがとうございました!

6

1 答え

スキーマがあれば、あなたがしようとしていることは不可能です。ドット表記法は複数レベルにすることができますが、複数のレベルが配列の場合は、位置演算子 '$'を使用してもアドレス指定できなくなります。

例えば。あなたはする必要があります:

db.my_collection.update( 
    {'websites.blog_posts.url': 'http://www.example.com/01.html' },
    {'$set': {'websites.$.blog_posts.$.impressions': 549}},
     true );

しかし、MongoDBは最初の配列内の要素の位置を決定するだけなので、更新では2つの位置演算子を持つことはできません。

あなたの唯一の選択肢は、ユーザーのWebサイトの専用コレクションを持つようにスキーマを再設計することです(この場合、他の理由でも優れています)。

5
追加された
あなたは正しいです、私の問題は私のスキーマと埋め込みドキュメントを格納するための不適切な括弧です。代わりに、私は配列の角括弧を使用していました。私は今、適切なスキーマでドット表記を使用して、4レベルの深さで新しいフィールドを追加しました。
追加された 著者 Chris,
素晴らしい、幸運;)
追加された 著者 Remon van Vliet,