【发布时间】:2014-03-29 10:38:21
【问题描述】:
我有一个包含项目列表的 Mongo 文档。这些项目中的每一个都有一些与之相关的状态。
我想使用$elemMatch 返回状态符合特定条件的文档。
考虑以下文档。它代表一个订单,订单中的每一个商品都是不同的(它们代表眼镜):
{
"_id" : ObjectId("5335dcd6888a4f21dd77657c"),
"items" : [
{
"lens_type" : "STANDARD_INDEX_LENS",
"status" : {}
},
{
"lens_type" : "NO_LENS",
"status" : {
"shipped" : true
}
},
{
"lens_type" : "RX_SUN_LENS",
"status" : {
"received_from_lab" : true,
"sent_to_lab" : true,
"shipped" : true
}
}
]
}
我想查找所有“未发货”的项目 - 即 items.status.shipped 不存在。我想找到所有准备发货的物品。
但是,如果该物品有处方镜片 - lens_type 是 STANDARD_INDEX_LENS 或 RX_SUN_LENS - 那么我只有在从实验室收到它时才认为它未发货。 item.status.received_from_lab 存在。
我的查询不应返回上述文档。这是因为其中两件商品已发货,而另一件商品尚未发货但尚未发货received_from_lab。
但是,我的查询确实返回了这个文档!
这是我的查询:
{
"$and": [
{
"items": {
"$elemMatch": {
"lens_type": {
"$in": [
"STANDARD_INDEX_LENS",
"RX_SUN_LENS"
]
},
"status.received_from_lab": {"$exists": true}
}
}
},
{
"items": {
"$elemMatch": {
"status.shipped": {"$exists": false}
}
}
}
]
}
我的查询中的逻辑错误是什么?我应该改用什么构造?我需要在客户端进行这种过滤吗?
【问题讨论】:
-
我已经读了好几遍了。我看到了两种可能的答案,但这取决于您期望看到的结果。您能否将您的“结果”添加到问题中,或者至少确认您希望这个“整个”文档匹配。
-
@NeilLunn 你好!我的期望是该文档不匹配。因为: 1. 第一项有
STANDARD_INDEX_LENS,但没有密钥status.received_from_lab。因此,即使它也缺少密钥status.shipped,它也不符合条件。 2. 第 2 件和第 3 件商品的密钥为status.shipped,因此也不符合发货条件。因为没有任何物品可以发货,所以文件不应该被退回。
标签: mongodb mongodb-query