mongodb查询查找数组中的对象与另一个数组字段的元素不匹配的位置

时间:2016-02-17 04:21:56

标签: mongodb mongodb-query aggregation-framework

我收集了以下文件:

    private static void StartCopyAcrossAccount()
    {
        var sourceAccount = new CloudStorageAccount(new StorageCredentials("source-account-name", "source-account-key"), true);
        var sourceContainer = sourceAccount.CreateCloudBlobClient().GetContainerReference("source-container");
        var sourceBlob = sourceContainer.GetBlockBlobReference("blob-name");
        var sourceBlobSas = sourceBlob.GetSharedAccessSignature(new Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy()
            {
                SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1),
                Permissions = Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPermissions.Read
            });
        var sourceBlobSasUrl = sourceBlob.Uri.AbsoluteUri + sourceBlobSas;

        var targetAccount = new CloudStorageAccount(new StorageCredentials("target-account-name", "target-account-key"), true);
        var targetContainer = targetAccount.CreateCloudBlobClient().GetContainerReference("target-container");
        var targetBlob = targetContainer.GetBlockBlobReference("blob-name");

        var copyId = targetBlob.StartCopy(new Uri(sourceBlobSasUrl), null, null);
    }

我想找出mongodb查询,找出那些message.message_id不在message_id中的文档。 任何人都可以帮助我。

1 个答案:

答案 0 :(得分:2)

使用MongoDB 2.6及更高版本的最佳方法可能.aggregate()使用$redact

db.collection.aggregate([
    { "$redact": {
        "$cond": {
            "if": { 
                "$gt": [
                    { "$size": {
                        "$setIntersection": [
                            { "$map": {
                                "input": "$message",
                                 "as": "msg",
                                 "in": "$$msg.message_id"
                            }},
                            "$message_id" 
                        ]
                    }},
                    0
                ]
            },
            "then": "$$PRUNE",
            "else": "$$KEEP"
        }
    }}
])

"里里外外"这里的逻辑是$map用于取出" message_id"的键。来自"消息"数组,并返回与" message_id"进行比较;数组本身以查看$setIntersection的结果。这样就可以看到"十字路口"因为这里没有任何具体的说法,其中一个是"子集"另一个。所以它只是常见元素,否则有$setIsSubset

当然,如果该交叉点的$size大于0,则存在元素匹配。因此true条件将被修剪",而其他任何东西都被保留"。

或者在以前的版本中使用$where代替这个JavaScript eval,完全遵循相同的逻辑:

db.collection.find({
    "$where": function() {
        var self = this;
        return self.message.map(function(el) {
            return el.message_id;
        }).filter(function(el) {
            return self.mesage_id.indexOf(el) != -1
        }).length == 0;
    }
})

在早期版本中,对聚合管道的另一种看法也是可能的,但它需要几个管道阶段,因此需要多次完成。因此,这不是MongoDB 2.6之前的最佳选择。

无论如何,标准查询操作通常无法比较"文档的一个元素到另一个元素。因此,这将使聚合框架或$where成为可以进行此比较的两个工具。