2013-09-01 10 views
5

mongoose文書に格納されているコレクションから項目を削除しようとしています。私は次のことをやっている12のSKUで金魚を削除したいmongooseでMongoからサブ文書を削除します。

{ 
    "__v": 3, 
    "_id": "5221040475f174d59a000005", 
    "items": [ 
    { 
     "sku": 1321654654613213, 
     "name": "goldfish", 
     "quantity": 12, 
     "_id": "52224ed5bd9d340000000003" 
    }, 
    { 
     "sku": 12, 
     "name": "goldfish", 
     "quantity": 13, 
     "_id": "52225dcbf2f1e40000000003" 
    }, 
    { 
     "sku": 1299, 
     "name": "goldfish", 
     "quantity": 13, 
     "_id": "522260b6f2f1e40000000004" 
    } 
    ] 
} 

::私の文書はこのようになります

var inventory = res.locals.content; 
inventory.items.remove({sku: req.params.itemSku}, function (err, item) { 
    if (err) { 
    console.log('error occurred', err); 
    res.send('error'); 
    } 
    else { 
    res.send('Item found and deleted'); 
    return; 
    } 
}); 

私はこれを行うとき、私はエラー「TypeError例外を取得します:プロパティ '未定義のequals'を読み取ることができません。なぜか分からない。

+0

「equals」という単語は、入力したコードには含まれません。おそらくスタックトレースを提供できますか? –

答えて

10

inventory.items.pull(req.params.itemSku)とし、inventory.saveコールが必要です。 .removeはトップレベルのドキュメント用です

+0

'inventory.items.pull({sku:req.params.itemSku}); ' を使用しても、エラーは発生しませんが、一致するskuを持つ要素ではなく配列全体が返されます。何故ですか? – Brandon

+3

'pull'はおそらく' inventory.items.pull(blah).push(blah) 'を行うことができるように、おそらく連鎖性のために' this'を返します。 https://github.com/LearnBoost/mongoose/blob/c328227a21004c7c1a295d215bbe55801e29c9ea/lib/types/array.js#L470 –

26

サブ文書の機能がremoveに変更されました。スペックから次のように使用してください。

var doc = parent.children.id(id).remove(); 
parent.save(function (err) { 
    if (err) return handleError(err); 
    console.log('the sub-doc was removed') 
}); 
+0

これはアトミックコールですか? – FRD

+2

あなたはそれをmongooseの微妙なドキュメントからそのままコピーしました – OllyBarca

+0

実際には、実際の保存はアトミックです。ソースを見て、 'remove()'が 'MongooseArray.pull'を使用しています。これはv4のdocs:'配列アトミックに ' - あなたが配列インデックスが同期しなくなることを心配している場合に備えて。つまり、受け入れられた答えの状態と同じように、 'MongooseArray.pull'を使って同じことをすることができます。 – Joao

3

finaly!

MongoDB: 

"imgs" : {"other" : [ { 
     "crop" : "../uploads/584251f58148e3150fa5c1a7/photo_2016-11-09_21-38-55.jpg", 
     "origin" : "../uploads/584251f58148e3150fa5c1a7/o-photo_2016-11-09_21-38-55.jpg", 
     "_id" : ObjectId("58433bdcf75adf27cb1e8608") 
            } 
          ] 
        }, 
router.get('/obj/:id', function(req, res) { 
var id = req.params.id; 



Model.findOne({'imgs.other._id': id}, function (err, result) { 
     result.imgs.other.id(id).remove(); 
     result.save();    
    }); 
関連する問題