2017-01-26 10 views
0

私たちの文書 'tags配列のタグの名前を変更したいと思います。コレクション内のすべてのタグacに変更します。私は、タグユニークを維持する必要がありMongoDB:同時に配列フィールドに追加して削除する

[ { _id: …, tags: ['a', 'b', 'c'] }, 
    { _id: …, tags: ['a', 'b'] }, 
    { _id: …, tags: ['b', 'c', 'd'] } ] 

:文書はこのような何かを見て。これは、最初の文書は、タグc二回含むことになりますので、このようなアップデートは、動作しません、意味:

db.docs.update(
    { tags: 'a' }, 
    { 
     $pull: { 'a' }, 
     $addToSet: { 'c' } 
    } 
) 

をしかし、これは与えられる:だから

db.docs.update(
    { tags: 'a' }, 
    { $set: { 'tags.$': 'c' } } 
) 

、私が代わりにこれを試してみましたMongoError: Cannot update 'tags' and 'tags' at the same time

1つの更新でタグの名前を変更する可能性はありますか?

+0

[mongoと同時にプルとaddtosetの可能な複製](http://stackoverflow.com/questions/24300148/pull-and-addtoset-at-the-same-time-with-mongo) – Yogesh

答えて

1

official MongoDB documentationによれば、要素のセットに対して「置換」操作を表現する方法はありません。だから私は、1つの更新でこれを行う方法はないと思います。

更新: いくつかのより多くの調査の後、私はthis文書に出くわしました。私はそれを正しく理解していれば、クエリは次のようになります。

クエリに一致する「タグ」配列の最初の要素のセレクタを表し
db.docs.update({ 
     tags: 'a' 
    }, { 
    $set: { 'tags.$': 'c'} 
    }) 

ので、それは最初の発生を置き換える「$はタグ」。 'と' c '。私が理解しているように、あなたの「タグ」配列には重複が含まれていないので、最初の一致が唯一の一致となります。

+0

ありがとうあなたのためにあなたの応答。あなたのアップデートについて:これは私が最初に試したものです。しかし、重複が作成されます: 'c'が既に配列にある場合、' a'は 'c'に名前が変更され、配列には' c'が2つあります。 – qqilihq

+0

ああ!私はその部分を逃したようだ。それから私は、私の答えの最初の部分が当てはまると思います。それは、あなたが単一の操作でその意図をはっきりと表現できないと述べています。 mongodb update docにネストされたクエリが含まれているかどうかはよくわかりません。 あなたが表現する必要があるのは "distinct(union($ row.tags、['a'])、['c']))」であるため、書くことができても面倒です。 sqlの言葉では、この単純な形式でも苦痛に見えます。 –

+0

私は、あなたが最初にaddToSet a要素が含まれているどこにでも 'c'要素を追加し、次に 'a'を削除する2番目の更新を実行する必要があるのでしょうか? –

関連する問題