如何从数组中删除单个元素
How to remove a single Element from Array
我想使用 MongoDB C# 驱动程序从每个文档中删除一个字段。
我有这样的文件:
{
"_id": ObjectId("554e05dfc90d3d4dfcaa2aea"),
"username": "abc",
"someArray": [
{
"_id": ObjectId("554e0625a51586362c33c6df"),
"IsReadOnly": false
},
{
"_id": ObjectId("554e0625a51586362c33c6df"),
"IsReadOnly": true
}
]
}
我想从 "someArray" 中删除字段 "IsReadOnly",无论值是真还是假。
在 MongoDB 中,我可以使用以下脚本实现:
db.getCollection('Collection').find({}).forEach( function(doc) {
var arr = doc.someArray;
var length = arr.length;
for (var i = 0; i < length; i++) {
delete arr[i]["IsReadOnly"];
}
db.getCollection('Collection').save(doc);
});
在 C# 中,我尝试了以下操作:
var update= Update.Pull("someArray",BsonValue.Create("IsReadOnly"));
// or: var update = Update.Unset("someArray.$[].IsReadOnly");
myDb.Collection.Update(null, update, UpdateFlags.Multi);
但是 "IsReadOnly" 没有被删除。如何从每个数组和每个文档中删除此字段?
您好,您是否尝试过 MongoDb.Driver.Linq .. 类似的东西:
var myEntity = myDb.Collection.AsQueryable().Where(xx=> xx.MyProp == somthing).FirstOrDefault(); //<-- to Extract your entity with Array Inside
然后..
var myArray = myEntity.ArrayNested.Where(xx=> xx.prop != conditiontoMatchElement).ToList();
然后 .. 在您的实体中重置您的新数组(没有元素)..
myentity.ArrayNested = myArray;
..然后更新它...
var result = myDb.Collection.ReplaceOne(x => x.Id.Equals(myentity.Id), myentity, new UpdateOptions
{
IsUpsert = false
});
希望对你有帮助!!..
P.S。如果你的 Array 没有嵌套,你可以做同样的事情,但不要在父 Entity
中设置它
在 MongoDB 中,您可以使用以下脚本实现:
db.getCollection('Collection').find({},{'someArray.IsReadOnly':0})
关键点是 {'someArray.IsReadOnly':0}
- find()
方法的投影参数。
在此处阅读有关 find() 的信息 - https://docs.mongodb.com/manual/reference/method/db.collection.find/index.html
在 Mongo 查询语言中,表示此更新的最简单方法是使用 $[]
(位置全部)运算符。它看起来像这样:
db.col.update({},{$unset:{"someArray.$[].IsReadOnly":1}},{multi:true})
但是,this operator has not been explicitly implemented 在 C# 驱动程序中可用的强类型 Builders
。
由于缺少此运算符,您必须构建更新 "by hand"。这是一个快速示例。
var mongo = new MongoClient();
var db = mongo.GetDatabase("test");
var col = db.GetCollection<BsonDocument>("col");
await col.UpdateManyAsync(new BsonDocument(), Builders<BsonDocument>.Update.Unset("someArray.$[].IsReadOnly"));
如果您有一些自定义序列化设置(例如小驼峰式字段名称),则字段命名可能存在一些缺陷,因此请务必进行测试。
值得注意的是,这个答案取决于您 运行 3.6 或更高版本的 MongoDB。如果您是 运行 旧版本,此方法将不起作用,因为 $[]
运算符在早期版本中不存在。
以下是如何使用我的库 MongoDB.Entities 以强类型方式完成此操作。它需要 ElemMatch
和 Unset
定义生成器方法的帮助。
using MongoDB.Entities;
namespace Whosebug
{
public class Program
{
public class User : Entity
{
public string Name { get; set; }
public Post[] Posts { get; set; }
}
public class Post : Entity
{
public string Title { get; set; }
public bool IsReadOnly { get; set; }
}
static void Main(string[] args)
{
new DB("test");
var posts = new[] {
new Post{ Title= "first post", IsReadOnly= true},
new Post {Title = "second post", IsReadOnly = false}
};
posts.Save();
(new User
{
Name = "Test User",
Posts = posts
}).Save();
DB.Update<User>()
.Match(f => f.ElemMatch(u => u.Posts, p => p.IsReadOnly == true || p.IsReadOnly == false))
.Modify(d => d.Unset(u => u.Posts[-1].IsReadOnly))
.Execute();
}
}
}
以下更新命令发送到 mongodb:
db.User.update(
{
"Posts": {
"$elemMatch": {
"$or": [
{
"IsReadOnly": true
},
{
"IsReadOnly": false
}
]
}
}
},
{
"$unset": {
"Posts.$.IsReadOnly": NumberInt("1")
}
}
)
我想使用 MongoDB C# 驱动程序从每个文档中删除一个字段。
我有这样的文件:
{
"_id": ObjectId("554e05dfc90d3d4dfcaa2aea"),
"username": "abc",
"someArray": [
{
"_id": ObjectId("554e0625a51586362c33c6df"),
"IsReadOnly": false
},
{
"_id": ObjectId("554e0625a51586362c33c6df"),
"IsReadOnly": true
}
]
}
我想从 "someArray" 中删除字段 "IsReadOnly",无论值是真还是假。
在 MongoDB 中,我可以使用以下脚本实现:
db.getCollection('Collection').find({}).forEach( function(doc) {
var arr = doc.someArray;
var length = arr.length;
for (var i = 0; i < length; i++) {
delete arr[i]["IsReadOnly"];
}
db.getCollection('Collection').save(doc);
});
在 C# 中,我尝试了以下操作:
var update= Update.Pull("someArray",BsonValue.Create("IsReadOnly"));
// or: var update = Update.Unset("someArray.$[].IsReadOnly");
myDb.Collection.Update(null, update, UpdateFlags.Multi);
但是 "IsReadOnly" 没有被删除。如何从每个数组和每个文档中删除此字段?
您好,您是否尝试过 MongoDb.Driver.Linq .. 类似的东西:
var myEntity = myDb.Collection.AsQueryable().Where(xx=> xx.MyProp == somthing).FirstOrDefault(); //<-- to Extract your entity with Array Inside
然后..
var myArray = myEntity.ArrayNested.Where(xx=> xx.prop != conditiontoMatchElement).ToList();
然后 .. 在您的实体中重置您的新数组(没有元素)..
myentity.ArrayNested = myArray;
..然后更新它...
var result = myDb.Collection.ReplaceOne(x => x.Id.Equals(myentity.Id), myentity, new UpdateOptions
{
IsUpsert = false
});
希望对你有帮助!!..
P.S。如果你的 Array 没有嵌套,你可以做同样的事情,但不要在父 Entity
中设置它在 MongoDB 中,您可以使用以下脚本实现:
db.getCollection('Collection').find({},{'someArray.IsReadOnly':0})
关键点是 {'someArray.IsReadOnly':0}
- find()
方法的投影参数。
在此处阅读有关 find() 的信息 - https://docs.mongodb.com/manual/reference/method/db.collection.find/index.html
在 Mongo 查询语言中,表示此更新的最简单方法是使用 $[]
(位置全部)运算符。它看起来像这样:
db.col.update({},{$unset:{"someArray.$[].IsReadOnly":1}},{multi:true})
但是,this operator has not been explicitly implemented 在 C# 驱动程序中可用的强类型 Builders
。
由于缺少此运算符,您必须构建更新 "by hand"。这是一个快速示例。
var mongo = new MongoClient();
var db = mongo.GetDatabase("test");
var col = db.GetCollection<BsonDocument>("col");
await col.UpdateManyAsync(new BsonDocument(), Builders<BsonDocument>.Update.Unset("someArray.$[].IsReadOnly"));
如果您有一些自定义序列化设置(例如小驼峰式字段名称),则字段命名可能存在一些缺陷,因此请务必进行测试。
值得注意的是,这个答案取决于您 运行 3.6 或更高版本的 MongoDB。如果您是 运行 旧版本,此方法将不起作用,因为 $[]
运算符在早期版本中不存在。
以下是如何使用我的库 MongoDB.Entities 以强类型方式完成此操作。它需要 ElemMatch
和 Unset
定义生成器方法的帮助。
using MongoDB.Entities;
namespace Whosebug
{
public class Program
{
public class User : Entity
{
public string Name { get; set; }
public Post[] Posts { get; set; }
}
public class Post : Entity
{
public string Title { get; set; }
public bool IsReadOnly { get; set; }
}
static void Main(string[] args)
{
new DB("test");
var posts = new[] {
new Post{ Title= "first post", IsReadOnly= true},
new Post {Title = "second post", IsReadOnly = false}
};
posts.Save();
(new User
{
Name = "Test User",
Posts = posts
}).Save();
DB.Update<User>()
.Match(f => f.ElemMatch(u => u.Posts, p => p.IsReadOnly == true || p.IsReadOnly == false))
.Modify(d => d.Unset(u => u.Posts[-1].IsReadOnly))
.Execute();
}
}
}
以下更新命令发送到 mongodb:
db.User.update(
{
"Posts": {
"$elemMatch": {
"$or": [
{
"IsReadOnly": true
},
{
"IsReadOnly": false
}
]
}
}
},
{
"$unset": {
"Posts.$.IsReadOnly": NumberInt("1")
}
}
)