2017-03-26 15 views
0

で一意である場合、配列にobjecctを追加するこれは私のスキーマです:オブジェクトフィールドがMondoDB /マングース

let userSchema = new Schema({ 
    email: { type: String, required: true }, 
    password: { type: String, required: true }, 
    books: [{ cover: String, title: String, link: String }], 
}); 

私は、そのオブジェクトが存在しない場合にのみ、書籍配列にオブジェクトをプッシュしています。私はこれが動作しない理由を理解していない:私はユーザが見つけたと言っているbooks配列は、書籍の配列に新しいオブジェクトを追加していないことを確認する配列を確認してください。しかし、私の配列には重複がまだ残っています。

:クエリはusermodelが渡される関数の内部で実行されている、および書籍データを含むオブジェクトがinfo.titleしたがってinfoと呼ばれます。

model.findOneAndUpdate(
    { email: user.email, 'books.title': { $ne: 'info.title ' } }, 
    { $addToSet: { "books": { title: info.title, cover: 
    info.cover, link: info.link } } }, 
    { new: true }, 
    (err, user) => { 
     if (err) throw err; 
     console.log(user); 
     } 
    ) 

値が文書である場合には、MongoDBのは、アレイの試合で、既存のドキュメント場合、ドキュメントが 複製であると判断したMongoDBの$ addToSetのドキュメントから

答えて

1

https://docs.mongodb.com/manual/reference/operator/update/addToSet/#behavior

方向に感謝追加される文書 は正確に文書化されます。すなわち、既存の文書は全く同じフィールド を有し、値およびフィールドは同じ順序である。したがって、フィールドオーダー は重要であり、MongoDBが のサブセットのみをドキュメント内のフィールドと比較して、ドキュメントが既存の配列エレメントの複製である であるかどうかを判断することはできません。あなたがここにも良い答えMongoDB - $addToSet on a list of Embedded Document

を見つけることができます