如果您有子文档数组,Mongoose会自动为每个数组创建ID.例:
{
_id: "mainId"
subDocArray: [
{
_id: "unwantedId",
field: "value"
},
{
_id: "unwantedId",
field: "value"
}
]
}
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉Mongoose不为数组中的对象创建id?
我正在将我的应用程序从 express.js 移动到 Nest.js,并且我找不到一种方法来引用另一个 mongoose Schema,而不使用使用 mongoose.Schema({...}) 声明 Schema 的旧方法。
让我们使用文档中的示例,以便我可以澄清我的问题:
@Schema()
export class Cat extends Document {
@Prop()
name: string;
}
export const CatSchema = SchemaFactory.createForClass(Cat);
Run Code Online (Sandbox Code Playgroud)
现在,我想要的是这样的:
@Schema()
export class Owner extends Document {
@Prop({type: [Cat], required: true})
cats: Cat[];
}
export const OwnerSchema = SchemaFactory.createForClass(Owner);
Run Code Online (Sandbox Code Playgroud)
当我以这种方式定义模式时,我会收到一个错误,类似于:无效的模式配置:Cat不是数组中的有效类型cats
那么,使用这种更面向对象的方法来定义架构,在另一个架构中引用一个架构的正确方法是什么?
是否有可能在一个的ObjectId MODELA以参考子文件modelB?
var C = new Schema({...});
var B = new Schema({c: [C]});
var A = new Schema({c: { type: ObjectId, ref: 'ModelB.ModelC' });
var Model_A = mongoose.model('ModelA', A);
var Model_B = mongoose.model('ModelB', B);
var Model_C = mongoose.model('ModelC', C);
Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的文档:
{
"_id" : ObjectId("56fea43a571332cc97e06d9c"),
"sections" : [
{
"_id" : ObjectId("56fea43a571332cc97e06d9e"),
"registered" : [
"123",
"e3d65a4e-2552-4995-ac5a-3c5180258d87"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想删除只有特定部分'e3d65a4e-2552-4995-ac5a-3c5180258d87'的registered数组中的._id'56fea43a571332cc97e06d9e'
我目前的尝试是这样的,但它只是返回未修改的原始文档.
db.test.findOneAndUpdate(
{
$and: [
{'sections._id': ObjectId('56fea43a571332cc97e06d9e')},
{'sections.registered': 'e3d65a4e-2552-4995-ac5a-3c5180258d87'}
]
},
{
$pull: {
$and: [
{'sections._id': ObjectId('56fea43a571332cc97e06d9e')},
{'sections.registered': 'e3d65a4e-2552-4995-ac5a-3c5180258d87'}
]
}
})
Run Code Online (Sandbox Code Playgroud)
我已经查看了$pull,但我似乎无法弄清楚如何使它适用于包含另一个数组的嵌套对象数组.这些$pull例子似乎只涉及一个嵌套级别.如何删除从匹配条目registered的项目阵列中sections与阵列_id,我的供应?
我有一个projects包含以下文件的集合:
{
"_id" : ObjectId("589eff3fee3d13019843f55a"),
"name" : "Project A",
"desc" : "test",
"numofvms" : 0,
"templates" : [
{
"_id" : ObjectId("589e4c14ee3d131bac8b403c")
},
{
"_id" : ObjectId("589e4c1dee3d131bac8b403d")
}
],
"nodes" : [
{
"_id" : ObjectId("589eff8f2bb59057c3f9b89d"),
"name" : "Node A"
},
{
"_id" : ObjectId("589eff962bb59057c3f9b89e"),
"name" : "Node B"
},
{
"_id" : ObjectId("589eff982bb59057c3f9b89f"),
"name" : "Node C"
},
{
"_id" : ObjectId("589eff9a2bb59057c3f9b8a0"),
"name" : "Node D"
}
],
"links" : [ ]
}
Run Code Online (Sandbox Code Playgroud)
我尝试接收nodes给定文档(项目)的子文档(字段)数组,但没有根文档。结果应如下所示:
[ …Run Code Online (Sandbox Code Playgroud) 我正在尝试从子文档数组中获取特定字段
我不会在父文档中包含任何字段
这是示例文档
{
"_id" : ObjectId("5409dd36b71997726532012d"),
"hierarchies" : [
{
"rank" : 1,
"_id" : ObjectId("5409df85b719977265320137"),
"name" : "CTO",
"userId" : [
ObjectId("53a47a639c52c9d83a2d71db")
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
如果userId在userId数组中,我想返回层次结构的等级
这是我在查询中到目前为止的内容
collectionName.find({{hierarchies:
{$elemMatch : {userId: ObjectId("53a47a639c52c9d83a2d71db")}}}
, "hierarchies.$.rank", function(err,data){}
Run Code Online (Sandbox Code Playgroud)
到目前为止,它返回我想要的层次结构数组中的整个对象,但我想将其限制为对象的rank属性.
假设我有一个类似的文档
{
"_id" : 5,
"rows": [
{ "id" : "aab", "value":100},
{ "id" : "aac", "value":400},
{ "id" : "abc", "value":200},
{ "id" : "xyz", "value":300}
]
}
Run Code Online (Sandbox Code Playgroud)
我需要在每个子文档"status"中添加一个新键:1,结果应该是这样的
{
"_id" : 5,
"rows": [
{ "id" : "aab", "value":100, "status":1},
{ "id" : "aac", "value":400, "status":1},
{ "id" : "abc", "value":200, "status":1},
{ "id" : "xyz", "value":300, "status":1}
]
}
Run Code Online (Sandbox Code Playgroud)
我如何通过单个更新查询来完成此操作?
我需要在模式中保存一些子文档,该模式是模式的子文档.保存功能是这样的:
exports.add = function(req, res){
var cliente = new Cliente(req.body);
var sedi = [];
for(var key in req.body.sede){
var sede = new Sede(req.body.sede[key]);
var luoghi_consegna_sedi = [];
for(jey in req.body.sede[key].lcs){
var luogo_consegna_sede = new LuoghiConsegnaSede(req.body.sede[key].lcs[jey]);
//Sub document
luoghi_consegna_sedi.push(luogo_consegna_sede);
}
sede.luoghi_consegna_sedi = luoghi_consegna_sedi;
//Sub docuemnt
sedi.push(sede);
}
cliente.sedi = sedi;
cliente.save(function(err){
if(err)
return res.sendStatus(400);
return res.json(cliente);
});
};
Run Code Online (Sandbox Code Playgroud)
问题是顶级父模式(cliente)保存在mongoldb上,而两种类型的子文档则没有.在cliente.sedi中,数组中填充了sede objectid,但是在mongoldb上,sede表不存在(对于luoghi_consegna_sedi也是如此).如果我在将它们推入数组之前手动保存sede和luoghi_consegna_sedi,则会创建两个表并填充数据,但如果我在cliente.sedi上运行populate(),我会得到一个空数组.3个架构是这些:Cliente
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var ClienteSchema = new Schema({
data_status: String,
status_cliente: Number,
titolo_cliente: String,
cognome: String,
nome: …Run Code Online (Sandbox Code Playgroud) 这是我的数据,包括书籍收藏,以及books.reviews子集合.
books = [{
_id: ObjectId("5558f40ad498c653748cf045"),
title: "Widget XYZ",
isbn: 1234567890,
reviews: [
{
_id: ObjectId("5558f40ad498c653748cf046"),
userId: "01234",
rating: 5,
review: "Yay, this great!"
},
{
_id: ObjectId("5558f40ad498c653748cf047"),
userId: "56789",
rating: 3,
review: "Meh, this okay."
}
]
}]
Run Code Online (Sandbox Code Playgroud)
在Node.js中(使用Mongoose),我需要用户能够通过表单提交评论,将评论和书籍的isbn发送到服务器,具有以下条件:
我可以通过4个单独的查询来完成此操作,但我知道这不是最佳的.我可以使用的查询数量最少(当然,这些查询是什么)?
我想通过clientSchema中的属性'token'查询子文档数组.但是我无法填充子文档数组.它总是返回空值.
这就是我的尝试
var performAuthAsync = promise.promisify(performAuth);
var response = {};
performAuthAsync(req).then(function (client) {
sendStatus(res, 200, { "success": "true", "value": client });
}).catch(ApiError, function (e) {
response.error = "true";
response.message = e.message;
if (e.message == "Invalid Authorization" || e.message == "Unauthorized access") {
console.log(e.message);
sendStatus(res, 401, response, req.query.type);
}
else {
sendStatus(res, 500, response, req.query.type);
}
});
Run Code Online (Sandbox Code Playgroud)
PerformAuth方法
function performAuth(req, callback) {
try {
var authHeader = req.headers.authorization;
console.log(authHeader);
//error in req format
if (!authHeader || !authHeader.startsWith("Basic ")) {
console.log("inside fail …Run Code Online (Sandbox Code Playgroud)