我正在为一个新项目设计数据库结构,我对MongoDB很新,显然是Mongoose.
我已经阅读过Mongooses 人口文档,它有一对多的关系,一个Person文档到很多Story文档,但是令我困惑的部分是在哪里而不是Story引用Person它所属的文档的文档,Person架构设置了它所以它有一个Story"拥有"的文件数组.
我正在设置与此类似的东西.但我一直认为创建新Story文档以获取Person文档ID 会更容易.但也许这只是因为我更熟悉使用连接的MySQL关系.
如果这是最好的方法(并且我确定它是,因为它在文档中),在Story创建新文档时,最新的方法是更新People它所属的相关文档中的故事数组?我看了但找不到任何更新现有文档的例子来添加对其他文件的引用(或删除它们)
我确信这是一个简单的解决方案,我只是忽略了什么,但任何帮助都会很棒.谢谢!
我在这里看到了很多这个问题的答案,但我仍然没有得到它(也许是因为他们使用了更多"复杂"的例子)...所以我想要做的是一个"客户"的架构,它将有两个将嵌套"子字段"的字段,以及可能重复的其他字段.这就是我的意思:
let customerModel = new Schema({
firstName: String,
lastName: String,
company: String,
contactInfo: {
tel: [Number],
email: [String],
address: {
city: String,
street: String,
houseNumber: String
}
}
});
Run Code Online (Sandbox Code Playgroud)
电话和电子邮件可能是一个数组.和地址不会重复,但有一些子字段,你可以看到.
我怎样才能做到这一点?
在文档中有deleteMany()方法
Character.deleteMany({ name: /Stark/, age: { $gte: 18 } }, function (err) {});
Run Code Online (Sandbox Code Playgroud)
我想删除多个具有一个共同属性而另一个属性不同的文档.像这样的东西:
Site.deleteMany({ userUID: uid, id: [10, 2, 3, 5]}, function(err) {}
这个的正确语法是什么?
看起来像这样定义我的架构:
var PossessionSchema = new mongoose.Schema({
thing: {type: mongoose.Schema.Types.ObjectId, ref:"Thing"}
});
Run Code Online (Sandbox Code Playgroud)
或者这样:
var PossessionSchema = new mongoose.Schema({
thing: {type: mongoose.Schema.ObjectId, ref:"Thing"}
});
Run Code Online (Sandbox Code Playgroud)
两者都有效.我看到猫鼬指南使用Schema.Types.ObjectId
http://mongoosejs.com/docs/schematypes.html
但我很困惑,两者都有效.
Schema应该使用哪一个?这两者有什么区别?
我有
Page.findById(pageId).then(page => {
const pageId = page.id;
..
});
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果没有给出页面ID,它应该只是在给定一些条件的情况下获取第一个可用页面,这是由完成的
Page.findOne({}).then(page => {
const pageId = page.id;
..
});
Run Code Online (Sandbox Code Playgroud)
但如果没有找到任何页面,它应该创建一个新页面并使用它,这是完成的
Page.create({}).then(page => {
const pageId = page.id;
..
});
Run Code Online (Sandbox Code Playgroud)
但是如何将所有这些组合成尽可能少的线?
我内心有很多逻辑
page => { ... }
Run Code Online (Sandbox Code Playgroud)
所以我非常想做到这一点,所以我可以避免这样做
if (pageId) {
Page.findById(pageId).then(page => {
const pageId = page.id;
..
});
} else {
Page.findOne({}).then(page => {
if (page) {
const pageId = page.id;
..
} else {
Page.create({}).then(page => {
const pageId = page.id;
..
});
}
});
}
Run Code Online (Sandbox Code Playgroud)
我想我也许可以用类似的东西为模式分配一个静态 …
我遇到了一件奇怪的事.我有几个猫鼬模型 - 在其中一个(只有一个!)我得到这个错误:
TypeError: Schema is not a constructor
Run Code Online (Sandbox Code Playgroud)
我觉得很奇怪,因为我有几个工作模式.我尝试登录mongoose.Schema非工作模式,它确实与我工作模式中的mongoose.Schema不同 - 这怎么可能?代码几乎相同.这是非工作模式的代码:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var errSchema = new Schema({
name: String,
images:[{
type:String
}],
sizes:[{
type: String
}],
colors:[{
type: Schema.ObjectId,
ref: 'Color'
}],
frontColors:[{
type: Schema.ObjectId,
ref: 'Color'
}],
script: Boolean
},{
timestamps: true
});
var Err = mongoose.model('Err', errSchema);
module.exports = Err;
Run Code Online (Sandbox Code Playgroud)
工作架构的代码:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var colorSchema = new Schema({
name: String,
image: String, …Run Code Online (Sandbox Code Playgroud) 本质上,我只是尝试将新的子文档添加到具有以下模式的现有mongodb文档中
/models/server/destination.js
// this is the "destination" model for mongoose
var mongoose = require('mongoose')
var Adventure = require('../models/adventure')
// this is the schema that every entry will get when a new trip is made.
var tripSchema = mongoose.Schema({
name: { type: String, required: true },
city: { type: String, required: true },
dateStart: { type: Date, required: true },
dateFinish: { type: Date, required: true },
adventures: [Adventure]
})
// module.exports makes this model available to other file
module.exports = …Run Code Online (Sandbox Code Playgroud) 我有Mongoose 架构和模型:
var MyClientSchema = new mongoose.Schema({
fist_name: {
type: String
},
phone_number: {
type: String
}
});
var MyClient = mongoose.model('MyClient', MyClientSchema);
Run Code Online (Sandbox Code Playgroud)
我应该如何记录(使用JSDoc)MyClient和/或MyClientSchema获取tab-completion并从WebStorm两个继承自mongoose.model类似的方法中输入建议?remove, findOne, find并从类似继承phone_number and first_name?
我在我的当前项目的NodeJS利用猫鼬(这是真棒顺便说一句!),我有一个MDB集合多数民众赞成要存储的文件在不同的集合的变化(基本上是一个更新日志存储了什么修改)
我如何努力实现这一点是创建一个存储文档的JSON版本的函数,这是通过pre('save')钩子完成的.然后创建另一个钩子,通过它执行post('save'),比较存储的数据pre('save'),并将其与文档新数据进行比较.
这是我到目前为止所拥有的:
var origDocument
var testVar = 'Goodbye World'
module.exports = ( schema, options ) => {
schema.pre( 'save', function( next ) {
// Store the original value of the documents attrCache.Description value
origDocument = this.toJSON().attrCache.Description
// Change the testVar value to see if the change is reflected in post(save)
testVar = 'Hello World'
next()
} )
schema.post( 'save', function( ) {
// Attempt to compare the documents previous value …Run Code Online (Sandbox Code Playgroud) 知道为什么当我创建猫鼬模式时智能感知完全没用吗?即使它过去曾经有用过。
我已经搜索了很多关于这个主题的内容,但不幸的是找不到任何可以提供帮助的内容。
Node.js 相关扩展我有:EsLint JavaScript and TypeScript Nightly Node 扩展包 npm intellesense path intellesense REST Client Visual studio Intellicode
mongoose-schema ×10
mongoose ×8
node.js ×7
mongodb ×6
javascript ×3
addchild ×1
autocomplete ×1
database ×1
jsdoc ×1
mean-stack ×1