2017-12-30 48 views
0

としてフィールドの名前を変更することができ、私はMongoDBのを持っていると私は、次のスキーマを持つようにしたい:はどのように私は関数の引数にMongoDB

directory: { 
    "file1": "id", 
    "directory1":{ 
     "file1": "..." 
     "file2": "..." 
     "file3": "..." 
     "direcrtory1": {} 
    } 
} 

私の質問は:どのように私は、関数のフィールド名を選択することができます$次の関数の引数としてpush?

function createFile(projectId,filename,id){ 
     return Project.updateOne({projectId:projectId},{$push:{directory:{filename: id}}}); 
} 

上記のコードは、データベースでこれを作成します。

"directory": [ 
    { 
     "id": "someID", 
     "filename": "something" 
    } 

は今、私は、「ファイル名」がそのように命名されたくありません。関数で次のパラメータ(someID、 'something'、 'anotherId )を取得した場合、データベースには' filename 'が含まれます: anotherId 'であり、出力したいのは' something ':' anotherId 'です。どうすれば入手できますか?

任意の助けが理解されるであろう

対処:

var update = {$set:{}}; 
update.$set[filename] = id; 
Project.updateOne({projectId: projectId},update,{upsert: true}); 
+0

アップデートサンプルからは、あなたもMongooseを使用しているようですが、それは正しいのですか? – Paul

+0

はい、それは間違いです –

答えて

0

マングーススキーマを使用して点はMongoのコレクション内のオブジェクトの形状を強制することです。スキーマに準拠していないフィールドは保持されません。あなたが記述しているように、格納された各オブジェクトに異なるフィールドが必要な場合は、MongoClientを直接使用してプレーンなJSオブジェクトを保存するか、変数名を作成するスキーマで混合タイプを定義する必要があります。

後者の場合は、保存する前にmarkModified()に電話して、発生した変更をMongooseに認識させる必要があることに注意してください。

これでMongooseの例を追加しました。あなたは私が言ったことをやるだけです。

const DirectorySchema = new Schema({ 
      path: String, 
      contents: Mixed 
    }); 

そして、「内容」欄には、あなたが望むものは何でも保存することができますが、そのスキーマに基づいてモデルを保存する前にmarkModifiedを呼び出す必要があります。

+0

いいえ、データベースの登録ごとに異なるフィールド名を使用することはできませんか? –

+0

私が言ったように、埋め込まれたドキュメントが埋め込まれたドキュメントが混合データ型として登録されている場合、またはMongooseを使用しないことによっても行うことができます。データベースは気にしませんが、Mongooseはスキーマを強制します。 – Paul

+0

私はそれをどのようにすることができるかの例を教えてもらえますか? –

関連する問題