Updating Specific Fields in a Collection
result = await SS_ClassRoom.update_one(
{
"$and": [
{"Class_Room_Uid": self.Class_Room_Uid},
{"Rucode": self.Rucode}
]
},
{
"$set": {
"LoginStatus": ConstStatusLogout # 0 for logged out, 1 for logged in
}
}
)
Inserting New Documents into a Collection
new_entry = {
"StudentMid": p["StudentMid"],
"StudentGroupMid": p["StudentGroupMid"],
"AttendenceType": p["AttendenceType"], # 1. normal, 2. late, 3. leave, 4. absent
"Lessons": p["Lessons"],
"Subject": p["Subject"],
"PublicClass": p["PublicClass"],
"PunchDateTime": datetime.strptime(p["PunchDateTime"], "%Y-%m-%d %H:%M:%S"),
"CreateDateTime": datetime.utcnow()
}
try:
existing_record = await SS_AttendenceLog.find_one(filter=dupRecodFilter, sort=[('Created_Time', -1)])
deletion_result = await SS_AttendenceLog.delete_many(filter=dupRecodFilter)
insertion_result = await SS_AttendenceLog.insert_one(new_entry)
except Exception as ex:
self.resData["failed"].append(p)
continue
Understanding Upsert Behavior in MongoDB with PyMongo
The upsert option in MongoDB allows updating an existing document or inserting a new one based on a condition.
Example setup:
db.user.insert({"name":"user1", "age":12, "sex":"male"})
db.user.insert({"name":"user2", "age":13, "sex":"male"})
db.user.insert({"name":"user3", "age":14, "sex":"male"})
Query all records:
db.user.find()
Result:
{ "_id" : ObjectId("54c75876662ee1617463f0a3"), "name" : "user1", "age" : 12, "sex" : "male" }
{ "_id" : ObjectId("54c75880662ee1617463f0a4"), "name" : "user2", "age" : 13, "sex" : "male" }
{ "_id" : ObjectId("54c7588d662ee1617463f0a5"), "name" : "user3", "age" : 14, "sex" : "male" }
Perform an upsert update:
db.user.update({"name":"user1"}, {"$set":{"age":21}}, {"upsert":"true"})
db.user.find()
Result:
{ "_id" : ObjectId("54c75876662ee1617463f0a3"), "name" : "user1", "age" : 21, "sex" : "male" }
{ "_id" : ObjectId("54c75880662ee1617463f0a4"), "name" : "user2", "age" : 13, "sex" : "male" }
{ "_id" : ObjectId("54c7588d662ee1617463f0a5"), "name" : "user3", "age" : 14, "sex" : "male" }
Using $setOnInsert to set fields only during insert:
db.user.update({"name":"user1"}, {"$set":{"age":21}, "$setOnInsert":{"sex":"female"}}, {"upsert":"true"})
db.user.find()
Result (no change):
{ "_id" : ObjectId("54c75876662ee1617463f0a3"), "name" : "user1", "age" : 21, "sex" : "male" }
{ "_id" : ObjectId("54c75880662ee1617463f0a4"), "name" : "user2", "age" : 13, "sex" : "male" }
{ "_id" : ObjectId("54c7588d662ee1617463f0a5"), "name" : "user3", "age" : 14, "sex" : "male" }
New record insertion due to no match:
db.user.update({"name":"user4"}, {"$set":{"age":21}, "$setOnInsert":{"sex":"female"}}, {"upsert":"true"})
db.user.find()
Result:
{ "_id" : ObjectId("54c75876662ee1617463f0a3"), "name" : "user1", "age" : 21, "sex" : "male" }
{ "_id" : ObjectId("54c75880662ee1617463f0a4"), "name" : "user2", "age" : 13, "sex" : "male" }
{ "_id" : ObjectId("54c7588d662ee1617463f0a5"), "name" : "user3", "age" : 14, "sex" : "male" }
{ "_id" : ObjectId("54c75a07478a805237d087c3"), "name" : "user4", "age" : 21, "sex" : "female" }
Set a default integer value for all documents in a collection:
db.SS_School.update({}, {$set: {"AttendenceType": NumberInt(1)}}, {multi: true})
Using regex for pattern matching in MongoDB:
db.getCollection('SS_School').find({$or:[{"SchoolName":{$regex:"网络"},"SchoolId":{$regex:"340"}}]})
Filtering using dynamic search parameters:
if SearchFiled:
_filter = {"$or": [{"SchoolName": {'$regex': SearchFiled}}, {"SchoolId": {'$regex': SearchFiled}},], 'AttendenceType': 1}
count = await School.count(filter=_filter)
SchoolRes = await School.find(filter=_filter, per_page=per_page, page=page)
else:
_filter = {"AttendenceType": 1}
SchoolRes = await School.find(filter=_filter, per_page=per_page, page=page)
count = await School.count(filter=_filter)
Copying a Collection Between Databases on the Same Server
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
Renaming a Field in a MongoDB Document
db.getCollection('character').update({}, {$rename:{"desc":"DESC"}}, false, true)
Removing a Field from Documents
db.User.update({}, {$unset:{'address':''}}, false, true)