有一份bson文件:
{
"_id" : ObjectId("5718441f5116a60b08000b8c"),
"mails" : [
{
"id" : 2,
"a" : [
{
"a" : 1
},
{
"a" : 2
}
]
},
{
"id" : 1,
"a" : [
{
"a" : 1
},
{
"a" : 2
}
]
}
]
}
我需要返回并清除属于给定文档的“mails.id == x”的数组“a”。所以我使用findAndModify,如:
db.mail.findAndModify({query: {"_id":ObjectId("5718441f5116a60b08000b8c")}, update: {$set:{"mails.$.a":[]}}, new: false, fields:{"mails":{$elemMatch:{"id":1}}}})
然而这不起作用。问题是$ set应该应用于数组中的一个文档而不是整个文档。所以我需要一个投影来预测它。
如果我将更新保留为空白,则会返回所需的部分:
{
"_id" : ObjectId("5718441f5116a60b08000b8c"),
"mails" : [
{
"id" : 1,
"a" : [
{
"a" : 1
},
{
"a" : 2
}
]
}
]
}
但我不知道如何清除'邮件'中的数组'a'
答案 0 :(得分:1)
您必须在查询中指定数组元素匹配:
db.mail.findAndModify({query:{“_ id”:ObjectId(“5718441f5116a60b08000b8c”),“邮件”:{$ elemMatch:{“id”:1}} },更新:{$ set:{“mails。$。a”:[]}},new:false,fields:{“mails”:{$ elemMatch:{“id”:1}}}})
更新中的 new: false
与文档中第一个匹配的元素匹配,因此您必须在查询中匹配它。此外,此查询将更新文档,但它将返回旧版本,因为您使用true
,如果您想要将更新版本设置为var fs = require('fs');
var ncp = require('ncp').ncp;
ncp.limit = 16;
fs.readdir(__dirname, function(err, files) {
for (var i = 0; i < files.length; i++) {
ncp(files[i], 'C:/Users/User/Desktop/output', function(err) {
if (err) {
return console.error(err);
}
console.log('done!');
});
}
});
。