我收集了以下文件:
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中的文档。 任何人都可以帮助我。
答案 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
成为可以进行此比较的两个工具。