【问题标题】:Confirm $addToSet adds an element确认 $addToSet 添加一个元素
【发布时间】:2014-06-30 16:44:07
【问题描述】:

我有一个函数通过 $addToSet 将一堆数据添加到 db 中,我需要确认数据是否已添加。由于 $addToSet 不添加重复项,我想知道是否没有添加重复项(向用户显示错误)或是否添加了 db 条目(向用户显示确认)。

我基本上需要 $addToSet 操作的回调。在文档中找不到它。 MongoDB新手。非常感谢帮助。

_notifications.update(
        {'username': data.username}, 
        { $addToSet: pushNotification }, function(err, docs){
            console.log(docs);
            if (docs == 0){
                co_notifications.insert(
                    {'username': data.username, 'notifications': insertNotification}, function(er, doc){
                });
            }
        },
        { upsert: true }
    );

【问题讨论】:

标签: node.js mongodb


【解决方案1】:

我可能遗漏了一些东西,但我唯一能真正看到的是新批处理操作 API 的结果。

var mongodb = require('mongodb'),
    MongoClient = mongodb.MongoClient;


MongoClient.connect("mongodb://localhost/test",function(err,db) {

  var col = db.collection("mytest");
  var batch = col.initializeOrderedBulkOp();


  batch.find({ "user": "me" }).upsert().updateOne({ "$addToSet": { "list": 5 } });
  batch.execute(function(err,result) {
    console.log( JSON.stringify( result, undefined, 4 ) );
  });

});

在您第一次执行“结果”的内容时,该示例列表将转储如下:

{
    "ok": 1,
    "writeErrors": [],
    "writeConcernErrors": [],
    "nInserted": 0,
    "nUpserted": 1,
    "nMatched": 0,
    "nModified": 0,
    "nRemoved": 0,
    "upserted": [
        {
            "index": 0,
            "_id": "5397ae995f04804cbeb7c663"
        }
    ]
}

每个创建的文档的显着键是“nUpserted”和“upserted”数组。即使我们只做一次,这毕竟是一个批处理操作。

在第二次执行时,它应该找到现有文档并匹配集合成员,你会得到:

{
    "ok": 1,
    "writeErrors": [],
    "writeConcernErrors": [],
    "nInserted": 0,
    "nUpserted": 0,
    "nMatched": 1,
    "nModified": 0,
    "nRemoved": 0,
    "upserted": []
}

这表明,当文档匹配时,实际上没有任何修改,因为集合成员是相同的。但是,如果您将 $addToSet 操作中应用的值更改为不存在的值,则响应将是:

{
    "ok": 1,
    "writeErrors": [],
    "writeConcernErrors": [],
    "nInserted": 0,
    "nUpserted": 0,
    "nMatched": 1,
    "nModified": 1,
    "nRemoved": 0,
    "upserted": []
}

这显示了“nMatched”和“nModified”值,表明文档实际上是由 $addToSet 操作更新的。

所以这可能是一种可能的方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多