MongoDB推送到具有预定义索引的数组

时间:2018-09-24 21:48:41

标签: mongodb mongoose

如果要将项目推入数组的项目,如何将其添加到Mongoose? 我想将其推送到具有预定义_id的文档,推送到具有预定义“ id”的“ productList”数组,再推送至“ items”数组。

{
"_id" : ObjectId("5ba94316a48a4c828788bcc9"),
"productList" : [
    {
        "id" : 1,
        "items" : [ 
            {
                "id" : 1,
                "name" : "FLOSS 500",
            }
        ]
    }
  ]
}

我认为应该是这样,但是没有用:

Products.findOneAndUpdate({_id: req.body._id, productList: {id: req.body.id}}, {$push: {'items': req.body.product}})

1 个答案:

答案 0 :(得分:0)

您可以使用位置运算符$进行尝试。对于按嵌套数组属性搜索,请使用点分隔的语法:

Products.findOneAndUpdate({ 
    _id: req.body._id, 
    'productList.id': req.body.id 
}, { $push: { 'productList.$.items': req.body.product } });

完整示例:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const Products = mongoose.model('Test', new Schema({
    productList: []
}));

mongoose.connect("mongodb://localhost:27017/myapp");

let item = new Products({
    "_id": mongoose.Types.ObjectId("5ba94316a48a4c828788bcc9"),
    "productList": [
        {
            "id": 1,
            "items": [
                {
                    "id": 1,
                    "name": "FLOSS 500",
                }
            ]
        }
    ]
});

Products.deleteMany({}).then(() => {
    return Products.create(item);
}).then(() => {
    return Products.findOneAndUpdate({
        _id: mongoose.Types.ObjectId("5ba94316a48a4c828788bcc9"),
        'productList.id': 1
    }, {
        $push: {
            'productList.$.items': {
                "id": 2,
                "name": "FLOSS 600",
            }
        }
    });
}).then(() => {
    return Products.find({
        _id: mongoose.Types.ObjectId("5ba94316a48a4c828788bcc9"),
        'productList.id': 1
    });
}).then(data => {
    console.log(data);

    if (data) {
        console.log(data[0].productList);
        /* [{"id":1,"items":[{"id":1,"name":"FLOSS 500"},{"id":2,"name":"FLOSS 600"}]}] */
    }
}).catch(err => {
    console.error(err);
});