2

私はマングースで2つのスキーマを設定しています:

var Job = new mongoose.Schema({
    title: String,
    budget: Number
});

var JobModel = mongoose.model('Job', Job);

var Customer = new mongoose.Schema({
    name: String,
    jobs: [Job]
});

var CustomerModel = mongoose.model('Customer', Customer);

顧客モデルには、一連のジョブモデルがあります。

私は次のように新しい仕事を追加しています:

app.post('/api/jobs', function(req, res){

    var job = new JobModel({
        title: req.body.title,
        budget: req.body.budget
    });

    job.save(function(err){
        if(!err){
            CustomerModel.findById(req.body.customerId, function(err, customer){
                if(!err){
                    customer.jobs.push(job);
                    customer.save(function(err){
                        if(!err){
                            return console.log('saved job to customer');
                        }
                    });
                }
            });
            return console.log('created job');

        } else {
            return console.log(err);
        }
    });

    return res.send(job);
});

新しい仕事を追加して、正しいと思うすべての顧客を取得すると、次のようになります。

[{
    "__v": 1,
    "_id": "50f85695771aeeda08000001",
    "name": "Customer1",
    "jobs": [
      {
        "_id": "50fad6985edd968840000002",
        "budget": 100,
        "title": "job1"
      }
    ]
  }, ...]

ここで、job1を更新し、すべてのジョブをGETすると、ジョブ1が更新されます(予算は500になりました)

[{
    "title": "job1",
    "budget": 500,
    "_id": "50fad6985edd968840000002",
    "__v": 0
  }, ...]

ただし、customersジョブ配列のjob1は変更されません。

 [{
        "__v": 1,
        "_id": "50f85695771aeeda08000001",
        "name": "Customer1",
        "jobs": [
          {
            "_id": "50fad6985edd968840000002",
            "budget": 100,
            "title": "job1"
          }
        ]
      }, ...]

したがって、Customer1のジョブ配列を検索し、job1ジョブを見つけて更新する必要がありますか?それとも、更新または削除するたびに更新する必要がありますか、それともネスト全体を間違った方法で実行していますか?

customerのjobs配列はオブジェクトの配列であることがわかりましたが、それらは複製ではなく、ジョブの単なる参照コピーである可能性があると思いましたか?

4

1 に答える 1

15

Jobここにあるようにドキュメントの埋め込み配列を使用する場合、それらは完全に独立したコピーであり、個別のjobsコレクションとの同期を維持するのはあなた次第です。

別の方法は、jobsフィールドに参照Customerの配列を含め、必要に応じてMongooseのクエリ母集団を使用してオンデマンドでそれらを設定することです。ObjectId'Job'

jobs: [{type: Schema.Types.ObjectId, ref: 'Job'}]
于 2013-01-19T20:51:48.180 に答える