【问题标题】:Remove array entries containing an empty array删除包含空数组的数组条目
【发布时间】:2016-07-14 12:16:02
【问题描述】:

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

提前致谢

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

 });

【问题讨论】:

  • 什么查询?这里只有模式定义。
  • 查询在那里,没有滚动条,但如果你滚动会有更多代码
  • 错过了他们。并不重要,因为所有尝试失败都有充分的理由。主要用于无效语法,因为在每种情况下您都错过了单独的“查询”和“更新”参数。还是回答了。

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

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

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

    }
)

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

实际的“更新”部分在"products" 数组上应用$pull,以删除“内部”"rates" 为空数组的任何项目。所以$pull 中的“路径”实际上是在查看"products" 内容的内部,所以它是相对于该内容而不是整个文档。

$pull 自然会在一次操作中删除所有匹配的元素。 "multi" 仅在您确实要使用该语句更新多个文档时才需要

【讨论】:

    猜你喜欢
    • 2020-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多