如何从 Mongo 数据库中的子文档数组中删除与条件匹配的子文档
How to remove a subdocument matching a condition from an array of subdocuments in Mongo DB
我有一个 MongoDB 数据库,其中包含以下格式的文档:
{
"name": "",
"surname": "",
"ssn": "",
"tests": [
{
"date": "",
"attending": [
{
"id": "",
"role": ""
}
]
}
]
}
一份文件包含每个人的测试列表及其相关信息。我只想从每个文档中删除在某个日期 (2019-02-22) 之后由某个护士 (id = 0187).
由于所有日期都以 string 格式保存,为了进行日期比较,我按以下方式使用了 $dateFromString
运算符:
db.Vaccinations.aggregate([
"$match": {
"$expr": {
"$and": [
{
"$gte": [
{ "$dateFromString": { "dateString": "$tests.date"}},
ISODate("2019-02-22T00:00:00Z")
]},
{
"tests.attending.id" : "0187"
}
]
}
}
])
但是我无法使用 $pull
运算符删除对应的子文档。是否可以这样做,或者 $pull
是错误的操作员?
查询
- 从测试中只保留那些
- 或
date < "2019-02-22"
nurse != "0187"
这样,通过测试必须在日期之前或由另一位护士完成。
使用路径“$test.attending.id”检查 nurse != "0187"
以获取该测试的所有 ID(数组),并测试与 ["0187"]
的交集是否为空 = > 那个护士没有做测试。
*您可以根据需要使用 updateOne 或 updateMany
*如果日期具有相同的格式,我没有使用 $dateFromString
YYYY-MM-DD
比较会起作用,但通常将日期保存在数据库中,这会使事情变得更容易和更快。
update(
{},
[{"$set":
{"tests":
{"$filter":
{"input": "$tests",
"cond":
{"$or":
[{"$lt": ["$$test.date", "2019-02-22"]},
{"$eq":
[{"$setIntersection": [["0187"], "$$test.attending.id"]}, []]}]},
"as": "test"}}}}])
我有一个 MongoDB 数据库,其中包含以下格式的文档:
{
"name": "",
"surname": "",
"ssn": "",
"tests": [
{
"date": "",
"attending": [
{
"id": "",
"role": ""
}
]
}
]
}
一份文件包含每个人的测试列表及其相关信息。我只想从每个文档中删除在某个日期 (2019-02-22) 之后由某个护士 (id = 0187).
由于所有日期都以 string 格式保存,为了进行日期比较,我按以下方式使用了 $dateFromString
运算符:
db.Vaccinations.aggregate([
"$match": {
"$expr": {
"$and": [
{
"$gte": [
{ "$dateFromString": { "dateString": "$tests.date"}},
ISODate("2019-02-22T00:00:00Z")
]},
{
"tests.attending.id" : "0187"
}
]
}
}
])
但是我无法使用 $pull
运算符删除对应的子文档。是否可以这样做,或者 $pull
是错误的操作员?
查询
- 从测试中只保留那些
- 或
date < "2019-02-22"
nurse != "0187"
这样,通过测试必须在日期之前或由另一位护士完成。
使用路径“$test.attending.id”检查 nurse != "0187"
以获取该测试的所有 ID(数组),并测试与["0187"]
的交集是否为空 = > 那个护士没有做测试。
*您可以根据需要使用 updateOne 或 updateMany
*如果日期具有相同的格式,我没有使用 $dateFromString
YYYY-MM-DD
比较会起作用,但通常将日期保存在数据库中,这会使事情变得更容易和更快。
update(
{},
[{"$set":
{"tests":
{"$filter":
{"input": "$tests",
"cond":
{"$or":
[{"$lt": ["$$test.date", "2019-02-22"]},
{"$eq":
[{"$setIntersection": [["0187"], "$$test.attending.id"]}, []]}]},
"as": "test"}}}}])