【问题标题】:How to write update query in mongodb for deeply nested array?如何在 mongodb 中为深度嵌套数组编写更新查询?
【发布时间】:2016-01-14 16:59:40
【问题描述】:

您好,我有一个模型 Customer 及其架构

var customerSchema = new Schema({
    name: {type: String, required:true, trim: true, index: true, default: null, sparse: true},
    cardInfo: { type: [cardInfoSchema]}
})

var cardInfoSchema = new Schema({
    customerId : { type: String, required: true, index: true, unique: true,trim : true,  sparse: true},
    cards: { type:[cardsSchema], default:[]}
}, {_id: false});

var cardsSchema = new Schema({
    cardType   : { type: String, required: true, default: null, trim : true },
    isActive   : { type: String, required: true,  trim: true }, //0: not active, 1: active
    cardId     : { type: String, required: true,  trim: true },
    createdAt  : { type: Date, default: Date.now, required: true }
})

我想添加多张客户卡,所以我正在使用这个

var dataToSet = {
                    'cardInfo.customerId': '25934285649875',
                    $push: {
                        'cardInfo.cards': {
                            cardId: 'somecardid,
                            cardType: 'type',
                            createdAt: new Date().toISOString(),
                            isActive: true
                        }
                    }
                };

但是我收到了这个错误。

不能使用部分(cardInfo.customerId的cardInfo)遍历元素({cardInfo: []})

请帮助我编写查询以使用 mongodb 或 mongoose 添加客户卡。

【问题讨论】:

  • 请向我们展示您完整的 mongodb/mongoose 请求示例。

标签: node.js mongodb mongoose


【解决方案1】:

在您的更新中尝试 positional $ 运算符,它充当与查询文档匹配的第一个元素的占位符,当您使用它时,请确保 cards 数组字段必须显示为查询文档的一部分。在您的情况下,您希望将 card 文档添加到 'cards' 数组中,但前提是 cardId 不存在:

var query = {        
    "cardInfo.cards.cardId": { "$nin": ["somecardid"] }
};
var update = {        
    "$push": {
        "cardInfo": { "customerId": "25934285649875" },
        "cardInfo.$.cards": {
            cardId: "somecardid",
            cardType: "type",
            createdAt: new Date().toISOString(),
            isActive: true
        }
    }
};

Customer.update(query, update, function (err, result) { ... }); 

【讨论】:

  • 这是我的查询,它不起作用db.customers.update({"_id" : ObjectId("12345689")}, { "$push": { "cardInfo": { "customerId": "25934285649875" }, "cardInfo.$.cards": { cardId: "somecardid", cardType: "type", createdAt: new Date().toISOString(), isActive: true } } }, {} ) 出现此错误:WriteResult({ "errmsg" : "The field 'cardInfo' must be an array but is of type Object in document {_id: ObjectId('12345689')}" })
  • 确保卡片数组字段必须作为查询文档的一部分出现,即db.customers.update({"_id" : ObjectId("12345689"), "cardInfo.cards.cardId": { "$nin": ["somecardid"] }}, { "$push": { "cardInfo": { "customerId": "25934285649875" }, "cardInfo.$.cards": { cardId: "somecardid", cardType: "type", createdAt: new Date().toISOString(), isActive: true } } }, {} )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 2021-06-25
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多