.NET中MongoDB之CRUD
参考文档
- https://docs.mongoing.com/mongodb-crud-operations
- https://docs.mongodb.com/manual/crud/
- https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/first-mongo-app?view=aspnetcore-6.0&tabs=visual-studio#add-a-crud-operations-service
注意
- 使用use命令切换之前您无需创建数据库。当您第一次在数据库中存储数据时(例如在数据库中创建第一个集合),MongoDB会创建数据库
- MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中
- MongoDB向指定集合中插入文档时,如果指定集合不存在,MongoDB则会自动创建该集合
- 在MongoDB中,存储在集合中的每个文档都需要一个唯一的_id字段作为主键。 如果插入的文档省略_id字段,则MongoDB驱动程序会自动为_id字段生成ObjectId。
- MongoDB中的所有写操作都是单个文档级别的原子操作
- .NET CORE或更高版本请根据MongoDB版本安装 MongoDB.Driver Nuget包
新增
db.collection.insertOne()
插入一个文件
返回一个文档,其中包含新插入的文档的_id字段值
关于writeConcern请参考 https://mongoing.com/archives/2916
该操作不支持 db.collection.explain() 查询计划
语法
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)
实例代码
- MongoDB Shell
db.inventory.insertOne
(
{
item: "canvas",
qty: 100,
tags: ["cotton"],
size: { h: 28, w: 35.5, uom: "cm" }
}
)
- C#
var document = new BsonDocument
{
{ "item", "canvas" },
{ "qty", 100 },
{ "tags", new BsonArray { "cotton" } },
{ "size", new BsonDocument { { "h", 28 }, { "w", 35.5 }, { "uom", "cm" } } }
};
collection.InsertOne(document);
db.collection.insertMany()
插入多个文件
返回包含新插入的文档_id字段值的文档
ordered表示是否按顺序执行插入操作,默认为true
顺序添加的速度要慢于不按顺序添加的。
按照顺序添加的 操作遇到错误会直接停止,而不按照顺序的会继续执行在队列中的写操作
语法
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
实例代码
- MongoDB Shell
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])
- C#
var documents = new BsonDocument[]
{
new BsonDocument
{
{ "item", "journal" },
{ "qty", 25 },
{ "tags", new BsonArray { "blank", "red" } },
{ "size", new BsonDocument { { "h", 14 }, { "w", 21 }, { "uom", "cm"} } }
},
new BsonDocument
{
{ "item", "mat" },
{ "qty", 85 },
{ "tags", new BsonArray { "gray" } },
{ "size", new BsonDocument { { "h", 27.9 }, { "w", 35.5 }, { "uom", "cm"} } }
},
new BsonDocument
{
{ "item", "mousepad" },
{ "qty", 25 },
{ "tags", new BsonArray { "gel", "blue" } },
{ "size", new BsonDocument { { "h", 19 }, { "w", 22.85 }, { "uom", "cm"} } }
},
};
collection.InsertMany(documents);
db.collection.insert()
将单个文档或多个文档插入到集合中。该方法在MongoSH已被标记过期,不推荐使用。
语法
db.collection.insert(
<document or array of documents>, //数组或者文档都可以添加
{
writeConcern: <document>,
ordered: <boolean> //跟insertMany()操作作用一致
}
)
实例代码
- MongoDB Shell
db.inventory.insert
(
{
item: "canvas",
qty: 100,
tags: ["cotton"],
size: { h: 28, w: 35.5, uom: "cm" }
}
)
db.collection.bulkWrite()
批量执行写入操作
operation 要执行的操作,可用值有insertOne,deleteOne,updateOne,deleteMany,updateMany,replaceOne
语法
db.collection.bulkWrite(
[ <operation 1>, <operation 2>, ... ],
{
writeConcern : <document>,
ordered : <boolean>
}
)
实例代码
- MongoDB Shell
db.collection.bulkWrite( [
{ insertOne : { "document" : <document> } }
] )
- C#
var collection = db.GetCollection<Inventory>("test");
var requests = new List<WriteModel<Inventory>>()
{
new InsertOneModel<Inventory>(new Inventory()),
new InsertOneModel<Inventory>(new Inventory())
};
collection.BulkWrite(requests);
查询
查询全部
- SQL
SELECT * FROM Inventory
- MongoDB Shell
db.inventory.find( {} )
- C#
var filter = Builders<BsonDocument>.Filter.Empty;
var result = collection.Find(filter).ToList();
条件查询
逻辑查询运算符
$and 使用逻辑AND连接查询子句,返回与这两个子句条件匹配的所有文档
$not 反转查询表达式的效果,并返回与查询表达式_不_匹配的文档。
$nor 用逻辑NOR连接查询子句,返回所有不能匹配这两个子句的文档。
$or 用逻辑OR连接查询子句,返回与任一子句条件匹配的所有文档
比较查询运算符
$eq 匹配等于指定值的值
$gt 匹配大于指定值的值
$gte 匹配大于或等于指定值的值
$in 匹配数组中指定的任何值
$lt 匹配小于指定值的值
$lte 匹配小于或等于指定值的值
$ne 匹配所有不等于指定值的值
$nin 不匹配数组中指定的任何值
更多其他运算符
- 插入文档
db.inventory.insertMany([
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
- SQL
SELECT * FROM Inventory WHERE status = "D"
SELECT * FROM inventory WHERE status in ("A", "D")
SELECT * FROM inventory WHERE status = "A" AND qty < 30
SELECT * FROM inventory WHERE status = "A" OR qty < 30
SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")
- MongoDB Shell
在对相同字段进行等值检索的时候更建议使用$in而不是$or
MongoDB支持正则表达式操作符$regex来做字符串模式匹配
db.inventory.find( {status:"D"} )
db.inventory.find( { status: { $in: [ "A", "D" ] } } )
db.inventory.find( { status: "A", qty: { $lt: 30 } } )
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
db.inventory.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )
- C#
var filter = Builders<BsonDocument>.Filter.Eq("status", "D");
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.In("status", new[] { "A", "D" });
var result = collection.Find(filter).ToList();
var builder = Builders<BsonDocument>.Filter;
var filter = builder.And(builder.Eq("status", "A"), builder.Lt("qty", 30));
var result = collection.Find(filter).ToList();
var builder = Builders<BsonDocument>.Filter;
var filter = builder.Or(builder.Eq("status", "A"), builder.Lt("qty", 30));
var result = collection.Find(filter).ToList();
var builder = Builders<BsonDocument>.Filter;
var filter = builder.And(
builder.Eq("status", "A"),
builder.Or(builder.Lt("qty", 30), builder.Regex("item", new BsonRegularExpression("^p"))));
var result = collection.Find(filter).ToList();
嵌套文档查询
- 插入文档
db.inventory.insertMany([
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
- MongoDB Shell
整个嵌入式文档上的相等匹配要求与指定的文档完全匹配,包括字段顺序。
要在嵌入式/嵌套文档中的字段上指定查询条件,请使用点符号(“ field.nestedField”)
db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
db.inventory.find( { "size.uom": "in" } )
db.inventory.find( { "size.h": { $lt: 15 } } )
db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )
- C#
var filter = Builders<BsonDocument>.Filter.Eq("size", new BsonDocument { { "h", 14 }, { "w", 21 }, { "uom", "cm" } });
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.Eq("size.uom", "in");
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.Lt("size.h", 15);
var result = collection.Find(filter).ToList();
var builder = Builders<BsonDocument>.Filter;
var filter = builder.And(builder.Lt("size.h", 15), builder.Eq("size.uom", "in"), builder.Eq("status", "D"));
var result = collection.Find(filter).ToList();
数组查询
- 插入文档
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
{ item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
{ item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
{ item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] },
{ item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] }
]);
- MongoDB Shell
使用点运算符查询时,dim_cm.1 必须在双引号内
//顺序都必须一致才能查询出来
db.inventory.find( { tags: ["red", "blank"] } )
//查询tags中包含red和blank元素的文档,不考虑顺序
db.inventory.find( { tags: { $all: ["red", "blank"] } } )、
//查询所有文档中包含tags字段,如果tags为数组则查询数组中包含red元素的文档
db.inventory.find( { tags: "red" } )
//查询所有文档中包含dim_cm字段,如dim_cm为数组则查询数组里面存在大于25的元素的文档
db.inventory.find( { dim_cm: { $gt: 25 } } )
//查询dim_cm数组元素中存在大于15同时又存在小于20的文档
db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
//查询dim_cm数组元素中至少存在一个大于22且小于30的文档
db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )
//查询dim_cm数组第二个元素大于25的相关文档
db.inventory.find( { "dim_cm.1": { $gt: 25 } } )
//查询tags数组长度为3的相关文档
db.inventory.find( { "tags": { $size: 3 } } )
- C#
var filter = Builders<BsonDocument>.Filter.Eq("tags", new[] { "red", "blank" });
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.All("tags", new[] { "red", "blank" });
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.Eq("tags", "red");
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.Gt("dim_cm", 25);
var result = collection.Find(filter).ToList();
var builder = Builders<BsonDocument>.Filter;
var filter = builder.And(builder.Gt("dim_cm", 15), builder.Lt("dim_cm", 20));
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.ElemMatch<BsonValue>("dim_cm", new BsonDocument { { "$gt", 22 }, { "$lt", 30 } });
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.Gt("dim_cm.1", 25);
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.Size("tags", 3);
var result = collection.Find(filter).ToList();
嵌套文档数组查询
- 插入文档
db.inventory.insertMany( [
{ item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
{ item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
{ item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
{ item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
- MongoDB Shell
//查询instock数组包含指定元素的相关文档,顺序都必须一致才会匹配
db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )
//查询instock数组中存在qty字段小于等于20的元素的相关文档
db.inventory.find( { 'instock.qty': { $lte: 20 } } )
//查询instock数组中第一个元素qty字段小于等于20的相关文档
db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )
//查询instock数组元素中包含qty=5且warehouse=A的相关文档
db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )
//查询instock数组中至少存在一个qty字段大于10且小于等20的元素的相关文档(只能是同一个数组元素的qty字段)
db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )
//查询instock数组中存在qty字段大于10且小于20的元素相关的文档(可以是不同元素也可以是同一元素的qty字段)
db.inventory.find( { "instock.qty": { $gt: 10, $lte: 20 } } )
//查询instock数组中存在qty字段等于10且warehouse等于A的元素相关的文档(可以是不同元素也可以是同一元素的qty字段)
db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )
- C#
var filter = Builders<BsonDocument>.Filter.AnyEq("instock", new BsonDocument { { "warehouse", "A" }, { "qty", 5 } });
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.Lte("instock.qty", 20);
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.Lte("instock.0.qty", 20);
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.ElemMatch<BsonValue>("instock", new BsonDocument { { "qty", 5 }, { "warehouse", "A" } });
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.ElemMatch<BsonValue>("instock", new BsonDocument { { "qty", new BsonDocument { { "$gt", 10 }, { "$lte", 20 } } } });
var result = collection.Find(filter).ToList();
var builder = Builders<BsonDocument>.Filter;
var filter = builder.And(builder.Gt("instock.qty", 10), builder.Lte("instock.qty", 20));
var result = collection.Find(filter).ToList();
var builder = Builders<BsonDocument>.Filter;
var filter = builder.And(builder.Eq("instock.qty", 5), builder.Eq("instock.warehouse", "A"));
var result = collection.Find(filter).ToList();
查询指定字段
- 插入文档
db.inventory.insertMany( [
{ item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] },
{ item: "notebook", status: "A", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] },
{ item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] },
{ item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] },
{ item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
- SQL
SELECT _id, item, status from inventory WHERE status = "A"
SELECT item, status from inventory WHERE status = "A"
SELECT _id, size, item from inventory WHERE status = "A"
- MongoDB Shell
//根据指定条件查询item,status字段(_id字段会默认返回)
db.inventory.find( { status: "A" }, { item: 1, status: 1 } )
//根据指定条件查询item,status字段
db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )
//除开status,instock其他都字段都返回
db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )
//返回_id,item,status和size中的uom字段
db.inventory.find(
{ status: "A" },
{ item: 1, status: 1, "size.uom": 1 }
)
//除开size中的uom字段,其他都返回
db.inventory.find(
{ status: "A" },
{ "size.uom": 0 }
)
//返回item,status,和instock数组中的qty字段
db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )
//返回item,status,和instock数组中的最后一个元素
db.inventory.find( { status: "A" }, { item: 1, status: 1, instock: { $slice: -1 } } )
- C#
var filter = Builders<BsonDocument>.Filter.Eq("status", "A");
var projection = Builders<BsonDocument>.Projection.Include("item").Include("status");
var result = collection.Find<BsonDocument>(filter).Project(projection).ToList();
var filter = Builders<BsonDocument>.Filter.Eq("status", "A");
var projection = Builders<BsonDocument>.Projection.Include("item").Include("status").Exclude("_id");
var result = collection.Find<BsonDocument>(filter).Project(projection).ToList();
var filter = Builders<BsonDocument>.Filter.Eq("status", "A");
var projection = Builders<BsonDocument>.Projection.Exclude("status").Exclude("instock");
var result = collection.Find<BsonDocument>(filter).Project(projection).ToList();
var filter = Builders<BsonDocument>.Filter.Eq("status", "A");
var projection = Builders<BsonDocument>.Projection.Include("item").Include("status").Include("size.uom");
var result = collection.Find<BsonDocument>(filter).Project(projection).ToList();
var filter = Builders<BsonDocument>.Filter.Eq("status", "A");
var projection = Builders<BsonDocument>.Projection.Exclude("size.uom");
var result = collection.Find<BsonDocument>(filter).Project(projection).ToList();
var filter = Builders<BsonDocument>.Filter.Eq("status", "A");
var projection = Builders<BsonDocument>.Projection.Include("item").Include("status").Include("instock.qty");
var result = collection.Find<BsonDocument>(filter).Project(projection).ToList();
var filter = Builders<BsonDocument>.Filter.Eq("status", "A");
var projection = Builders<BsonDocument>.Projection.Include("item").Include("status").Slice("instock", -1);
var result = collection.Find<BsonDocument>(filter).Project(projection).ToList();
NULL和缺失字段查询
- 插入文档
db.inventory.insertMany([
{ _id: 1, item: null },
{ _id: 2 }
])
- MongoDB Shell
关于$type 请参考 https://docs.mongodb.com/v4.0/reference/bson-types/
关于$exists 请参考 https://docs.mongodb.com/v4.0/reference/operator/query/exists/#op._S_exists
//会查询出item为NULL和不存在item字段的文档
db.inventory.find( { item: null } )
//只会查询出包含item字段且值为NULL的文档
db.inventory.find( { item : { $type: 10 } } )
//只会查询出不包含item字段的文档
db.inventory.find( { item : { $exists: false } } )
- C#
请使用BsonNull.Value去查询MongoDB中的NULL值和不存在的字段
var filter = Builders<BsonDocument>.Filter.Eq("item", BsonNull.Value);
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.Type("item", BsonType.Null);
var result = collection.Find(filter).ToList();
var filter = Builders<BsonDocument>.Filter.Exists("item", false);
var result = collection.Find(filter).ToList();
修改
插入文档
db.inventory.insertMany( [
{ item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
{ item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
{ item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );
db.inventory.updateOne()
更新单个文档
查找与过滤器匹配的第一个文档,并应用指定的更新进行修改。
语法
db.collection.updateOne(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2.1
}
)
- filter 更新的选择标准。可以使用与find()方法相同的query selectors。 指定一个空文档{ }以更新集合中的所有文档。
- update 要应用的修改。可以是以下之一: 1. 更新文件:仅包含更新运算符表达式。有关更多信息,请参见 使用更新运算符表达式文档进行更新。 2. 聚合管道(从MongoDB 4.2开始):仅包含以下聚合阶段: a. $addFields及其别名 $set b. $project及其别名 $unset c. replaceRoot及其别名$replaceWith。
- upsert 可选的。当true,updateOne()时: 1. 如果没有文档匹配filter,则创建一个新文档。 2. 更新匹配filter的文档。 要避免多次 upsert,请确保filter字段为唯一索引。 默认为false。
- writeConcern 可选的。表示写关注的文件。省略使用默认写入问题。 如果在事务中运行,请不要为操作明确设置写关注点。
- collation 可选的。 指定要用于操作的排序规则。 排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则
- arrayFilters 可选的。过滤器文档的 array,用于确定要在 array 字段上为更新操作修改哪些 array 元素
- hint 可选的。一个文档或字符串,它指定用于支持查询谓词的索引。 该选项可以采用索引规范文档或索引名称字符串。 如指定的索引不存在,则操作错误。
实例代码
- MongoDB Shell
db.inventory.updateOne(
{ item: "paper" },
{
$set: { "size.uom": "cm", status: "P" },
$currentDate: { lastModified: true }
}
)
使用$set 运算符将size.uom字段的值更新为“ cm”,将状态字段的值更新为“ P”
使用$currentDate运算符将lastModified字段的值更新为当前日期。 如果lastModified字段不存在,则$currentDate将创建该字段。
- C#
var filter = Builders<BsonDocument>.Filter.Eq("item", "paper");
var update = Builders<BsonDocument>.Update.Set("size.uom", "cm").Set("status", "P").CurrentDate("lastModified");
var result = collection.UpdateOne(filter, update);
db.inventory.updateMany()
更新多个文档
语法
db.collection.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2.1
}
)
- 参数解释同db.inventory.updateOne()
实例代码
- MongoDB Shell
db.inventory.updateMany(
{ "qty": { $lt: 50 } },
{
$set: { "size.uom": "in", status: "P" },
$currentDate: { lastModified: true }
}
)
- C#
var filter = Builders<BsonDocument>.Filter.Lt("qty", 50);
var update = Builders<BsonDocument>.Update.Set("size.uom", "in").Set("status", "P").CurrentDate("lastModified");
var result = collection.UpdateMany(filter, update);
db.inventory.replaceOne()
替换文档
要替换_id字段以外的文档的全部内容,请将一个全新的文档作为第二个参数传递给
当替换一个文档时,替换文档必须只包含字段/值对;即不包括更新操作符表达式。
替换文档可以具有与原始文档不同的字段。在替换文档中,由于_id字段是不可变的,因此可以省略_id字段。但是,如果您确实包含_id字段,则它必须与当前值具有相同的值。
语法
db.collection.replaceOne(
<filter>,
<replacement>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>
}
)
- 参数解释同db.inventory.updateOne()
实例代码
- MongoDB Shell
db.inventory.replaceOne(
{ item: "paper" },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)
- C#
var filter = Builders<BsonDocument>.Filter.Eq("item", "paper");
var replacement = new BsonDocument
{
{ "item", "paper" },
{ "instock", new BsonArray
{
new BsonDocument { { "warehouse", "A" }, { "qty", 60 } },
new BsonDocument { { "warehouse", "B" }, { "qty", 40 } } }
}
};
var result = collection.ReplaceOne(filter, replacement);
db.collection.update()
更新
该语法在.NET nuget包 MongoDB.Driver中并不存在对应方法
语法
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
}
)
- multi 可选的。如果设置为true,则更新符合query条件的多个文档。如果设置为false,则更新一个文档。默认的 value 是false。
- 其他同db.inventory.updateOne()
实例代码
- MongoDB Shell
db.books.update(
{ stock: { $lte: 10 } },
{ $set: { reorder: true } },
{ multi: true }
)
其他方法
- db.collection.findOneAndReplace()
- db.collection.findOneAndUpdate()
- db.collection.findAndModify()
- db.collection.save()
- db.collection.bulkWrite()
删除
插入文档
db.inventory.insertMany( [
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
] );
db.collection.deleteMany()
要删除集合中的所有文档,请将空的filter文档{}传递给db.collection.deleteMany() 方法
您可以指定标准或过滤器,以标识要删除的文档。 filter使用与读取操作相同的语法。
语法
db.collection.deleteMany(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
- 参数解释同db.inventory.updateOne()
实例代码
- MongoDB Shell
db.inventory.deleteMany({})
db.inventory.deleteMany({ status : "A" })
- C#
var filter = Builders<BsonDocument>.Filter.Empty;
var result = collection.DeleteMany(filter);
var builder = Builders<BsonDocument>.Filter;
builder.And(builder.Eq(<field1>, <value1>), builder.Lt(<field2>, <value2>));
db.collection.deleteOne()
仅删除一个符合条件的文档(即使多个文档可以与指定过滤器匹配)
实例代码
- MongoDB Shell
db.inventory.deleteOne( { status: "D" } )
- C#
var filter = Builders<BsonDocument>.Filter.Eq("status", "D");
var result = collection.DeleteOne(filter);
.NET中MongoDB之CRUD的更多相关文章
- 【翻译】MongoDB指南/CRUD操作(三)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...
- MongoDB的CRUD操作
1. 前言 在上一篇文章中,我们介绍了MongoDB.现在,我们来看下如何在MongoDB中进行常规的CRUD操作.毕竟,作为一个存储系统,它的基本功能就是对数据进行增删改查操作. MongoDB中的 ...
- MongoDB简单CRUD场景
MongoDB简单CRUD命令操作 (1)新建数据库:use 数据库名 (2)显示所有数据库:show dbs; (3)新建集合(两种方式) 隐式创建:在创建集合的同时往集合里面添加数据---db. ...
- springboot连接mongodb进行CRUD
springboot连接mongodb进行CRUD的过程: 在执行以下操作前已安装了mongodb并创建了用户和数据库,使用Robo 3T可成功连接. 1.创建springboot项目,加入以下mav ...
- Node.js 中MongoDB的基本接口操作
Node.js 中MongoDB的基本接口操作 连接数据库 安装mongodb模块 导入mongodb模块 调用connect方法 文档的增删改查操作 插入文档 方法: db.collection(& ...
- Nodejs中Mongodb使用
Mongodb使用 打开解压后的Mongodb文件夹,新建data.logs文件夹,并在logs文件夹中新建mongodb.log文档. 添加后Mongod文件夹示意图: 用cmd命令行启动Mongo ...
- Ubuntu中MongoDB安装
在Ubuntu中MongoDB有时候启动不起来,可以参考以下方法从新安装: 1.导入包管理系统使用的公钥 Ubuntu 的软件包管理工具(即dpkg和APT)要求软件包的发布者通过GPG密钥签名来确保 ...
- 【翻译】MongoDB指南/CRUD操作(四)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...
- 【翻译】MongoDB指南/CRUD操作(二)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...
随机推荐
- 好客租房57-props深入(4props的默认值)
1给props设置默认值 //导入react import React from 'react' import ReactDOM from 'react-dom' import ...
- 好客租房3-React的基本使用
2.1React的安装 安装命令:npm i react react-dom react 包是核心,提供创建元素,组件等功能 react-dom包提供DOM相关功能等 2.2React的使用 1引入r ...
- 安装Net-Tools到CentOS(YUM)
Net-Tools是一个Linux系统中基本的网络工具集,其集成了常用的网络管理命令"ifconfig.netstat.arp.route等". 运行环境 系统版本:CentOS ...
- 【AC自动机】背单词
题意: 0 s v:添加价值为v的字符串s 1 t:查询t中含的s的权值和.(不停位置算多次) 思路: 在线AC自动机. 同学用过一个妙妙子的分块算法. 这里用二进制分组:通常用作把在线数据结构问题转 ...
- 队列的java实现
今天老师提出一个问题,就是如何用java实现队列呢?我在网上找了许多资料,发现java也是可以很轻松的实现队列. 如下代码: package com; import java.util.Collect ...
- 树莓派使用Docker部署EdgeX(jakarta版本)
使用Docker部署EdgeX 老师安排我搞边缘计算,搞了很久都没能明白边缘计算是什么,甚至对其兴趣不大,前一阵弄好了lorawan网关,该做网关内部的边缘计算了,发现自己已经慢慢地学了进去,总是想要 ...
- MVC - forward 和 redirect 的区别
MVC - forward 和 redirect 的区别 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服 ...
- 【Srping】事务的执行原理(一)
在使用事务的时候需要添加@EnableTransactionManagement注解来开启事务,那么就从@EnableTransactionManagement入手查看一下事务的执行原理. @Enab ...
- alertmanager集群莫名发送resolve消息的问题探究
alertmanager集群莫名发送resolve消息的问题探究 术语 告警消息:指一条告警 告警恢复消息:指一条告警恢复 告警信息:指告警相关的内容,包括告警消息和告警恢复消息 问题描述 最近遇到了 ...
- Spring jdbctemplate和事务管理器 全注解配置 不使用xml
/** * spring的配置类,相当于bean.xml */@Configuration//@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans ...