まず、ドキュメントを配列のように保存している場合は、単に配列として保存してみませんか?リレーショナルデータベースのバックグラウンドを持っている場合、その方法で保存したくなることはわかりますが、Mongoでは、配列のようなものであれば、配列として保存する必要があります。
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"0" : "h",
"1" : "o",
"2" : "m"
}
あるべき:
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"keys" : [ "h", "o", "m" ]
}
この場合、Mongoには$addToSet
という便利な演算子があります。 $push
と同じように機能します ただし、存在しない場合にのみ配列に追加されます。操作は次のようになります:
collection.update( query, { $addToSet : { 'keys' : 'l' }}, callback );
// add key 'l'
collection.update( query, { $addToSet : { 'keys' : 'm' }}, callback );
// looks in document, sees 'm' in array, and does nothing
編集:
更新により、配列にキーがない場合は追加されますが、存在するかどうかだけを知りたい場合は、findOne
を使用するのが最善の方法だと思います。 :
// find the doc by _id and the value you want in keys, returns null if it's not a match
collection.findOne({ _id : 52e5361f30f28b6b602e4c7f, 'keys' : 'l' }, function(err, doc) {
if( doc == null ) {
// do whatever you need to do if it's not there
} else {
// do whatever you need to if it is there
}
db.close();
}
挿入をそのままにするには、Keys
を変更するだけです。 宛先:
Keys = { 'keys' : [ 'key1', 'key2', 'key3' ] };
また、インサートを変更する必要はありません。また、コレクションで、_id
を変更することもできます。 username
になります またはusername
を追加します ドキュメントへのフィールド。