我在Mongoose中创建了这样的结构:
var Access = new Schema({
userId : { type: ObjectId, unique: true },
key : { type: String, index: true },
isOwner : { type: Boolean, index: true },
});
mongoose.model('Access', Access);
var Workspace = new Schema({
name : { type: String, lowercase: true, unique: true},
activeFlag : Boolean,
settings : {
welcomeMessage : String,
invoiceTemplate : String,
longName : String,
defaultCountry : String,
countryId : { type: ObjectId, index: true },
},
access : [ Access ],
});
mongoose.model('Workspace', Workspace);
添加一些文档后,我看到了结果:
{ "activeFlag" : true,
"name" : "w7",
"_id" : ObjectId("5036131f22aa014c32000006"),
"access" : [
{ "user": "merc",
"key" : "673642387462834",
"isOwner" : true,
"_id" : ObjectId("5036131f22aa014c32000007")
}
],
"__v" : 0
}
我对子文档中的_id
感到困惑,如果我将其添加为子结构而不是子模式,似乎不会发生这种情况。
所以问题:
1)
_id
来自哪里?是Mongoose的司机吗?如果是这样,我如何使用直接Mongodb达到相同的行为?只是添加一个ObjectId字段?
2) 你何时会使用子文档,何时只使用数据结构?
3) 我还没有开始使用我的Web应用程序的重要部分。但是,那个ID不是真的,我的意思是真的有用,例如你允许JsonRest访问文档中的子记录吗?
永远感谢你!
Merc的。
答案 0 :(得分:2)
编辑:根据以下评论删除了数据重复的答案。
要回答您的另一个问题,如何在MongoDB中复制它,您可以按如下方式创建该文档:
db.foo.insert(
{ "activeFlag" : true,
"name" : "w7",
"access" : [
{ "userId" : ObjectId(),
"key" : "673642387462834",
"isOwner" : true,
"_id" : ObjectId()
}
],
"__v" : 0
})
要解释一下,根文档中的_id是隐含的 - 如果没有指定,它将被MongoDB添加。但是,要将_id放入子文档,必须通过调用ObjectId()函数手动指定它。我的文档看起来像这样:
db.foo.find().pretty()
{
"_id" : ObjectId("50375bd0cee59c8561829edb"),
"activeFlag" : true,
"name" : "w7",
"access" : [
{
"userId" : ObjectId("50375bd0cee59c8561829ed9"),
"key" : "673642387462834",
"isOwner" : true,
"_id" : ObjectId("50375bd0cee59c8561829eda")
}
],
"__v" : 0
}