2016-09-22 50 views
1

比方說,我有這樣的定義的Person(集合persons):有沒有辦法從Mongoose中的一個查詢中的參數中創建父項及其子項?

const personSchema = Schema({ 
    name: String, 
    children: [{ 
    type: Schema.Types.ObjectId, 
    ref: 'Person', 
    }], 
}) 
const Person = mongoose.model('Person', personSchema) 

我不能直接存儲children一個Person內,因爲兩個對象可以鏈接到同一child,所以這就是爲什麼我做的這通過關係。

事情是,假設我想在一個查詢中創建一個Person及其children。我有一個args對象要充分利用數據,這樣的定義:

const args = { name: 'John', children: [{ name: 'Anna' }, {name: 'Craig'}] } 

我需要一個查詢創建persons集合內3個文件,其名稱JohnAnnaCraig,它也應該記錄AnnaCraigid小號John內的children場,這樣的:

{_id: 1, name: "John", children: [2, 3]} 
{_id: 2, name: "Anna"} 
{_id: 3, name: "Craig"} 

我想這個args傳遞到創造的樂趣ction這樣的:

Person.create(args) 

和它抱怨children陣列不是的ObjectId列數組。

我猜(沒有測試但)如果我更換childrentypepersonSchema相反,它會創建一個嵌套的文件,而不是,這是我不想要的。

所以,問題是:是否有一種方法在Mongoose中做我想要的一個查詢? (我也知道我可以做多個查詢來拯救每個孩子,然後保存父母,但有些事情告訴我這不是應該做的方式,應該有一個更簡單的方法來做到這一點)。

回答

2

嘗試以下方法插入這樣的文件:

使用收集插入查詢插入對象的數組: 例如:

PersonModel.collection.insert({ name: 'John', children: [{ name: 'Anna' }, {name: 'Craig'}] }, function() { 
    console.log("insert person data"); 
}); 

文件:

{ 
    "_id" : ObjectId("57e8da5e6be4d87da7824d29"), 
    "name" : "John", 
    "children" : [ 
     { 
      "name" : "Anna" 
     }, 
     { 
      "name" : "Craig" 
     } 
    ] 
} 

如果您想要每個子對象有_id,那麼你必須使用objectId構造函數手動生成objectId:

var mongoose = require('mongoose');

PersonModel.collection.insert({ 
    name: 'John', 
    children: [{ 
     _id: mongoose.Types.ObjectId(), 
     name: 'Anna' 
    }, { 
     _id: mongoose.Types.ObjectId(), 
     name: 'Craig' 
    }] 
}, function() { 
    console.log("insert person data"); 
}); 

輸出:

{ 
    "_id" : ObjectId("57e8dcd76e620c680d850ebe"), 
    "name" : "John", 
    "children" : [ 
     { 
      "_id" : ObjectId("57e8dcd56e620c680d850eba"), 
      "name" : "Anna" 
     }, 
     { 
      "_id" : ObjectId("57e8dcd56e620c680d850ebb"), 
      "name" : "Craig" 
     } 
    ] 
} 

UPDATE:

var mongoose = require('mongoose'); 

PersonModel.collection.insert([{ 
    name: 'Anna' 
}, { 
    name: 'Craig' 
}], { 
    ordered: true 
}, function(err, data) { 
    //console.log(data); 
    var parent = { 
     name: 'john', 
     children: data.insertedIds 
    }; 
    new PersonModel(parent).save() 

}); 
+0

這將創建1個嵌套的文件,我需要創建3個單獨的文件 – serge1peshcoff

+0

正如你在你的問題中提到沒有必要使用單獨的查詢來保存所有的孩子和父母。您可以使用相同的查詢創建所有文檔,但要設置子元素,您必須點擊另一個查詢。我會更新我的答案。 – Sachin

+0

@ serge1peshcoff查看已更新的答案。 – Sachin

相關問題