标签: subdocument

阻止Mongoose为子文档数组项创建_id属性

如果您有子文档数组,Mongoose会自动为每个数组创建ID.例:

{
    _id: "mainId"
    subDocArray: [
      {
        _id: "unwantedId",
        field: "value"
      },
      {
        _id: "unwantedId",
        field: "value"
      }
    ]
}
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉Mongoose不为数组中的对象创建id?

mongoose mongodb node.js subdocument

196
推荐指数
6
解决办法
6万
查看次数

Nest.js 中的猫鼬子文档

我正在将我的应用程序从 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

那么,使用这种更面向对象的方法来定义架构,在另一个架构中引用一个架构的正确方法是什么?

schema reference subdocument nestjs

23
推荐指数
1
解决办法
7718
查看次数

mongoose - 引用子文档的ObjectId

是否有可能在一个的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)

mongoose mongodb node.js subdocument

10
推荐指数
1
解决办法
9878
查看次数

MongoDB从对象数组中的数组中删除项

我有一个看起来像这样的文档:

{
  "_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,我的供应?

arrays mongodb mongodb-query subdocument

8
推荐指数
1
解决办法
2437
查看次数

MongoDB 3.4 - 获取没有根文档的子文档数组

我有一个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)

arrays field mongodb subdocument

7
推荐指数
1
解决办法
3199
查看次数

如何使用mongoose从子文档数组中检索特定字段

我正在尝试从子文档数组中获取特定字段

我不会在父文档中包含任何字段

这是示例文档

{
    "_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属性.

arrays mongoose mongodb subdocument

5
推荐指数
1
解决办法
634
查看次数

在Mongodb子文档数组中,有任何方法可以在每个子库中添加新字段

假设我有一个类似的文档

{
    "_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)

我如何通过单个更新查询来完成此操作?

arrays mongodb subdocument

5
推荐指数
1
解决办法
1280
查看次数

Mongoose不保存嵌套的子文档

我需要在模式中保存一些子文档,该模式是模式的子文档.保存功能是这样的:

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)

mongoose mongodb node.js subdocument

5
推荐指数
1
解决办法
1117
查看次数

当父文档可能不存在时更新MongoDB子文档

这是我的数据,包括书籍收藏,以及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发送到服务器,具有以下条件:

  1. 如果该书已经不存在特定的isbn,请添加它,然后添加评论(显然它尚不存在).
  2. 如果这本书确实存在......
    • 如果此用户对本书不存在评论,请添加该评论.
    • 如果审查并为这本书存在这个用户,更新.

我可以通过4个单独的查询来完成此操作,但我知道这不是最佳的.我可以使用的查询数量最少(当然,这些查询是什么)?

mongodb node.js subdocument

5
推荐指数
1
解决办法
706
查看次数

Mongoose populate()返回空数组

我想通过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)

mongoose mongodb node.js subdocument mongoose-populate

5
推荐指数
1
解决办法
497
查看次数