无法从数组中拉出$

时间:2014-06-13 08:16:26

标签: node.js mongodb

我尝试了很多不同的方法,但也许我没有mongodb需要我查询它的方式。

这就是doc的样子。

{
    "username" : "amitverma",
    "notifications" : {
        "notification_add_user" : [
            {
                "sender" : "a",
                "action" : "b",
                "type" : "c",
                "objectType" : "d",
                "objectUrl" : "e"
            }
        ]
    },
    "_id" : ObjectId("539aa673e97933e7a5000001")
}

我想删除" notification_add_user"中的对象。这些是我试图让它发挥作用的不同方式。

db.notifications.update(
    {'username': 'amitverma' },
    { $pull: {
         "notifications.notification_add_user":{'sender': "a"} 
    }}
)

这适用于控制台。

但是我为它编写的代码并没有完成任务。

// notificationtype is 'add_user'
removequery['notifications.notification_' + notificationtype] = { 'sender': 'a' };

co_notifications.update(
    {'username': data.username},
    {$pull : removequery}, function(err, docs){
    console.log('remove notification callback')
    console.log(err)
    console.log(docs)

})                             )

2 个答案:

答案 0 :(得分:0)

使用本机MongoDB驱动程序,我使用以下查询从节点控制台进行更新,它可以正常运行:

>MongoClient = require('mongodb').MongoClient;
>format=require('util').format;

>MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
    if(err) throw err;

    var collection = db.collection('notifications');
      collection.count(function(err, count) {console.log(format("count = %s", count));});
      collection.update(
        {'username': 'amitverma'},
        {$pull:{'notifications.notification_add_user':{'sender':'a'}}},{w:1},function(err){
            if (err) console.warn(err.message);
            else console.log('successfully updated');
      })
  })

答案 1 :(得分:0)

db.notifications.find({'username': 'amitverma' }).forEach( function(result) {
    var i;
    for(i in result.notifications.notification_add_user) {
        var sender = result.notifications.notification_add_user[i]['sender'];
        if(sender === 'a') {
            delete result.notifications.notification_add_user[i]['sender'];
        }
    }

    db.notifications.save(result);
});
  1. 首先,我将获得用户名等于的所有结果 'amitverma'
  2. 然后我遍历notification_add_user数组并查看发件人是否等于'a'并删除所有匹配结果
  3. 最后我保存更改