2017-01-09 5 views
1

私の頭を丸くするのに苦労しています - あらゆる方法を試しましたが、私は事を過度に複雑にしていると感じることはできません。mongooseで配列を更新する

Iは、例えば、アレイとして私のMongoDBデータベースに格納された値のセットを有する:

{ 
    _id: 1234, 
    users: ['Bob', 'James', 'Catherine', 'Emma'] 
} 

新しい配列は、次いで、例えば、サーバに自分のアプリから送信されます私は何をしたいのは、更新が配列するように

var newArray = ['Edward', 'Bob', 'David', 'James', 'Ellie', 'Monica'] 

です:

  1. 両方の配列内のすべての要素があるが削除され、新しいアレイで現在の任意の要素データベースではなく、新しい配列ではなく

だから、最終resul追加されたオリジナルのもので

  • 任意の要素を保持tはデータベースに保存する必要があります:

    ['Bob', 'James', 'Edward', 'David', 'Ellie', 'Monica'] 
    

    私は単に

    documents.findOneAndUpdate({ id: 1234 }, { 
        $set: { users: newArray } 
    }) 
    

    を実行しようとしましたが、それはないすべては、既存のものに新しいアレイを追加しているので、私は重複で終わるし、それ不要な値を削除しません - 以下にその結果:

    { 
        _id: 1234, 
        users: ['Bob', 'Bob', 'James', 'James', 'Catherine', 'Emma', 'David', 'Edward', 'Ellie', 'Monica'] 
    } 
    

    私も試してみた:

    を既存のものを複製せずに新しい値が追加されますが、新たに提出され、配列、すなわちにないものは削除されません

    { 
        _id: 1234, 
        users: ['Bob', 'James', 'Catherine', 'Emma', 'Edward', 'David', 'Ellie', 'Monica'] 
    } 
    

    はせずにこれを行う簡単な方法はあります複雑な一連のネストされたループと、データベースへの複数の呼び出し(私は現時点では向いているようです)?

    注:コールバックや.execの機能は上記のコードには含まれていません。これらは実行するために必要であることはわかっていますが、それらを含めるとちょっと複雑になると思います。

    編集:これは私が実際に作業しているものの簡略化されたバージョンですが、私が達成しようとしていることを実証する必要があります。

    ありがとうございます!

  • +0

    私は、[Lodas](https://lodash.com/docs/4.17.4#union)を使用してそれを – IARKI

    答えて

    0

    あなたは、このようにしてみてくださいでした:

    documents.findOne({ id: 1234 },function(doc) { 
        doc.users = newArray 
        doc.save() 
    }) 
    

    私は前に、このようなことをしなかったが、findOneAndUpdateと試みることはありません。

    +0

    パーフェクトにすることをお勧めします。私は物事が複雑すぎることを知っていた!時にはmongoDB/mongooseで同じことをする方法がたくさんあるので、簡単なことを見逃してしまうようです。とにかく、100万こんにちは! – Chris

    +0

    幸せなコーディングを手伝ってくれてうれしい! – damianfabian

    関連する問題