如何在mongodb中为深层嵌套数组编写更新查询?

时间:2016-01-13 06:15:41

标签: node.js mongodb mongoose

您好我有一个模型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.cinomerId的cardInfo)来遍历元素({cardInfo:[]})

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

1 个答案:

答案 0 :(得分:0)

在您的更新中尝试 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) { ... });