在mongo中检查数据的有效方法,如果它们不存在则创建它们

时间:2015-12-01 16:22:36

标签: javascript mongodb mongodb-query aggregation-framework

我正在尝试找到一种有效的方法来搜索mongo以查找是否存在提供的新数据(例如下面的电话号码),如果它们不存在我想将它们插入到另一个集合中。

如果phone number不存在,搜索与用户关联的数组[123456789,15,20]中的phone no.15, 20是否存在,那么我需要确定数据库中不存在的某种方式集合,所以我可以插入另一个集合。我正在尝试以最有效的方式找到我的要求的解决方案,所以我没有经常访问数据库。

用户集合

{
    "_id" : "mJPqhyyGoeyfa3p2w",
    "createdAt" : ISODate("2015-11-30T22:33:27.649Z"),
    "phone" : {
        "number" : "123456789",
        "verified" : true
    },
    "profile" : {
        "picture" : "xx",
            "name" : "User IOS Mobile"
    }
}

1 个答案:

答案 0 :(得分:0)

如果要将不在'lineNo'数组中的所有元素插入到另一个集合中,则需要使用preg_match()运算符和$project运算符。当然,$setDifference方法提供了对聚合管道的访问。

然后,您将使用.aggregate()操作进行插入。

var bulk = db.LineNoNotFound.initializeUnorderedBulkOp();
var count = 0;

db.inventory.aggregate([
    { '$group': {
        '_id': null,
        'phones': {'$push': '$phone.number'}
    }},  
    { '$project': {
          'notFound': {
             '$setDifference': [ [ 5, 15, 20, 25 ], '$phones' ]
         }
    }},
    { '$match': { 'notFound.0': { '$exists': true } } }
]).forEach(function(doc) {
    doc.notFound.forEach(function(num) {
        bulk.insert( { 'lineNo': num } );
        count++;
    });
    if (count % 100 === 0) {
         bulk.execute();
         bulk = db.LineNoNotFound.initializeUnorderedBulkOp();
    }
});

if (count > 0)  bulk.execute();