删除包含空数组的数组条目

时间:2016-03-26 23:13:28

标签: node.js mongodb mongoose mongodb-query

我正在尝试从产品阵列中删除产品没有费率的所有产品。在我下面的查询中,我试图检查费率数组的长度,但是 他们似乎都没有工作。任何帮助表示赞赏。

提前致谢

var ProductRateSchema = new Schema({
    product: {
        type: Schema.ObjectId,
        ref: 'products'
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User'
    },
    rates: [{
        type: Schema.ObjectId,
        ref: 'rates'
    }]
});

var InventorySchema = new Schema({
    name: {
        type: String,
        default: '',
        required: 'Please enter in a name',
        trim: true
    },
    created: {
        type: Date,
        default: Date.now
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User'
    },
    products: [productRateSchema]

});


var inventoryId = req.body.inventoryId;
var productId = req.body.productId;


// none of these queries work

db.inventory.findOneAndUpdate({ '_id': inventoryId,
 {$pull: {'products': { product: productId, 'rates': { $eq:[] }}}}, function (err, result) {

 });

db.inventory.findOneAndUpdate({ '_id': inventoryId,
 {$pull: {'products': { product: productId, 'rates': {$size: {$lt: 1}}}}}, function (err, result) {

 });


db.inventory.findOneAndUpdate({ '_id': inventoryId,
 {$pull: {'products': { product: productId, 'rates': null }}}, function (err, result) {

 });

1 个答案:

答案 0 :(得分:1)

不知道您尝试了什么,因为它根本没有包含在您的问题中,但检查空数组的最佳方法是基本查看0索引不匹配的位置{{3 }}:

Inventory.update(
    { "products.rates.0": { "$exists": false } },
    { 
        "$pull": {
            "products": { "rates.0": { "$exists": false } }
        }
    },
    { "multi": true },
    function(err,numAffected) {

    }
)

"查询" .update()语句的一部分确保我们甚至只尝试触摸"products.rates"中具有空数组的文档。这不是必需的,但它确实避免测试以下"更新"对于任何数组元素的条件不是true的文档的语句条件,从而使事情变得更快。

实际"更新"部分在"products"数组上应用$exists以删除其中任何"内部" "rates"是一个空数组。所以"路径" $pull内的"products"实际上是在查看$pull内容,所以它与此相关,而不是整个文档。

当然<p:layoutUnit collapsible="true" gutter="1"> </p:layoutUnit> 将删除在单个操作中匹配的所有元素。仅当您确实要使用语句

更新多个文档时,才需要$pull