【问题标题】:Should I aim to have child documents stored in separate collection我是否应该将子文档存储在单独的集合中
【发布时间】:2013-01-19 16:25:07
【问题描述】:

我已经构建了一些具有不太复杂的父子结构的猫鼬模式。当我创建我的父母时,我包含了一个与子模式匹配的 json 数组,并且子文档可以正常创建,但不会出现在 mongodb 的单独子集合中。

但是,如果我稍后添加更多子项,那么这些子项确实会出现在 mongodb 中的单独子集合中,并且在父项中有重复/引用(我使用 Model.create 创建它们,因为我需要访问它们的 ObjectId)

由于我是 NoSQL 新手,我不确定我是否仍应尝试保留子文档的单独集合。让我的一些孩子出现在单独的收藏中是否有任何负面影响?

最少的示例代码

var mongoose = require('mongoose'),
    arrangementSchema = mongoose.Schema({
        abc: String
    }),
    tuneSchema = mongoose.Schema({
        name: String,
        arrangements: [arrangementSchema]
    });

mongoose.connect('mongodb://localhost/jnr_dev');


var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {

});

var Arrangement = mongoose.model('Arr', arrangementSchema),
    Tune = mongoose.model('Tu', tuneSchema);


var tune = Tune.create({
    name: 'test'
}, function (err, newTune) {
    newTune.arrangements = [{abc:'abc1'}];
    newTune.save(function () {
        Arrangement.create({
            abc: 'abc2'
        }, function (err, arr) {
            newTune.arrangements.push(arr);
            newTune.save();
        });
    })
});

// and same behaviour with

var tune = Tune.create({
    name: 'test',
    arrangements: [{abc:'abc3'}]
}, function (err, newTune) {
    Arrangement.create({
        abc: 'abc4'
    }, function (err, arr) {
        newTune.arrangements.push(arr);
        newTune.save();
    });
});

Tus 收集结果

 {    "__v": NumberInt(2),    "_id": ObjectId("511037ef60e5af0000000002"),    "arrangements": {
     "0": {
       "abc": "abc1",
       "_id": ObjectId("511037ef60e5af0000000003")
    },
     "1": {
       "_id": ObjectId("511037ef60e5af0000000004"),
       "abc": "abc2"
    }   },    "name": "test" }

Arrs 集合中的结果

 {
   "abc": "abc2",
   "_id": ObjectId("511037ef60e5af0000000004"),
   "__v": NumberInt(0)
}   

【问题讨论】:

  • 这听起来像是一个意外的结果。您能否在此处发布一些完整的、可运行的、最小的示例代码来重现问题,以便我们帮助诊断?
  • @A.JesseJiryuDavis 附上样品。我应该在原始帖子中提到我也在使用猫鼬

标签: mongodb mongoose normalization nosql


【解决方案1】:

在第二个集合中创建文档的是 Arrangement.create() 调用。我假设您只需要 Tune 集合中的子文档数组。见:

http://mongoosejs.com/docs/subdocs.html

你应该这样做:

newTune.arrangements.push({
    abc: 'abc4'
});

newTune.save();

【讨论】:

  • 当我有另一种类型的文档parent2 也需要参考安排时怎么办。在这种情况下,我是否应该打算保留一个单独的安排集合,并仅使用 objectId 从父母那里引用?
  • 在这种情况下,是的 - 如果您有两种引用第三种文档的文档,则将它们全部分开可能是有意义的。请在此处查看“嵌入”和“引用”的讨论:docs.mongodb.org/manual/core/data-modeling/… 或此:10gen.com/presentations/schema-design-1
猜你喜欢
  • 1970-01-01
  • 2022-10-19
  • 2014-05-06
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2019-04-19
  • 2018-05-04
相关资源
最近更新 更多