【问题标题】:Efficient way of checking data in mongo and creating them if they don't exist在 mongo 中检查数据并在它们不存在时创建它们的有效方法
【发布时间】:2015-12-03 12:57:35
【问题描述】:

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

搜索与用户关联的数组 [123456789, 15, 20] 中的 phone number 是否存在,如果 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"
    }
}

【问题讨论】:

  • 因此,如果我了解您想要插入包含这些值的文档(如果它们不存在)。对吗?
  • 是的,插入另一个集合。
  • 收藏还是文档?
  • 如果您提供一个数组,您想找出数组中的哪些单独不存在?还是数组中的每个值?
  • @user3100115 我将有另一个集合名称 LineNoNotFound 我想在其中插入未找到的 LineNo。

标签: javascript mongodb mongodb-query aggregation-framework


【解决方案1】:

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

然后您将使用"bulk" 操作进行插入。

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多