MongoDB,从数组中删除对象

los*_*ion 71 javascript arrays mongoose mongodb node.js

文档:

{
   _id: 5150a1199fac0e6910000002,
   name: 'some name,
   items: [{
      id: 23,
      name: 'item name 23'
   },{
      id: 24,
      name: 'item name 24'
   }]
}
Run Code Online (Sandbox Code Playgroud)

有没有办法从数组中提取特定对象?IE如何从items数组中提取id为23的整个item对象.

我试过了:

db.mycollection.update({'_id': ObjectId("5150a1199fac0e6910000002")}, {$pull: {id: 23}});
Run Code Online (Sandbox Code Playgroud)

但是我很确定我没有正确使用'pull'.根据我的理解,pull将从数组中提取字段而不是对象.

任何想法如何将整个对象拉出阵列.

作为奖励,我试图在mongoose/nodejs中执行此操作,并且不确定这种类型的东西是否在mongoose API中但我找不到它.

sam*_*tin 119

尝试..

db.mycollection.update(
    {'_id': ObjectId("5150a1199fac0e6910000002")}, 
    { $pull: { "items" : { id: 23 } } },
false,
true 
);
Run Code Online (Sandbox Code Playgroud)

  • 那些布尔值是什么? (10认同)
  • @NicolasDelValle 如果我没记错的话,这些是选项“upsert”和“multi”。有关当前语法和文档,请检查此链接:https://docs.mongodb.com/manual/reference/method/db.collection.update/ (2认同)

小智 7

我有一个类似的文件

在此输入图像描述

我必须从地址数组中删除地址

在网上搜索了很多我找到了解决方案

Customer.findOneAndUpdate(query, {$pull: {address: addressId}}, function(err, data){
        if(err) {
          return res.status(500).json({'error' : 'error in deleting address'});
        }

        res.json(data);

      });
Run Code Online (Sandbox Code Playgroud)


Vir*_*tel 6

我的数据库:

{
  "_id" : ObjectId("5806056dce046557874d3ab18"),
  "data" : [ 
    { "id" : 1 }, 
    { "id" : 2 }, 
    { "id" : 3 }
  ]
}
    
Run Code Online (Sandbox Code Playgroud)

我的查询:

db.getCollection('play_table').update({},{$pull:{"data":{"id":3}}},{multi:true}
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "_id" : ObjectId("5806056dce046557874d3ab18"),
  "data" : [ 
    { "id" : 1 }, 
    { "id" : 2 }
  ]
}
Run Code Online (Sandbox Code Playgroud)


Shu*_*rma 6

你也可以试试:

db.getCollection('docs').update({ },{'$pull':{ 'items':{'id': 3 }}},{multi:true})
Run Code Online (Sandbox Code Playgroud)


小智 6

对于数组中的单个记录:

db.getCollection('documents').update(
    { },
    {'$pull':{ 'items':{'mobile': 1234567890 }}},
    {new:true}
);
Run Code Online (Sandbox Code Playgroud)

对于数组中具有相同手机号码的多条记录:

db.getCollection('documents').update(
    { },
    {
        $pull: {
            items: { mobile: 1234567890 }
        }
    },
    { new:true, multi:true }
)
Run Code Online (Sandbox Code Playgroud)