2016-03-26 13 views
0

製品に料金がない製品配列からすべての製品を削除しようとしています。以下の私の質問では、レート配列の長さを調べようとしましたが、 どれも動作していないようです。どんな助けもありがとうございます。それは単にあなたの質問に含まれていないので、事前に空の配列を含む配列エントリを削除します

おかげ

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

}); 
+0

どのようなクエリですか?ここにはスキーマ定義以外はありません。 –

+0

クエリはそこにあり、スクロールバーはありませんが、スクロールするとさらに多くのコードが表示されます。 – noobie

+0

が見つかりません。すべての試みが失敗する正当な理由があるので、本当に重要ではありません。すべての場合に欠けていた "query"と "update"という別個の引数があるため、主に無効な構文です。とにかく答える。 –

答えて

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ではないドキュメントの次の "update"文の条件をテストすることは避けられます。

実際の「更新」部分は$pull"products"アレイに適用して、「内側」"rates"が空の配列である項目を削除します。したがって、$pullの中の「パス」は実際には"products"の内容を見ているので、それはドキュメント全体ではなく、相対的です。

当然ながら、$pullは、1回の操作で一致するすべての要素を削除します。 "multi"は、実際に複数のドキュメントをステートメントで更新する場合にのみ必要です

関連する問題