【发布时间】:2016-07-17 20:27:27
【问题描述】:
MongoDB 选择器很快就会变得复杂,尤其是当您使用 JOIN 和其他花哨的关键字来自 mySQL 时。我尽力使这个问题的标题尽可能清晰,但惨遭失败。
例如,让 MongoDB 集合的文档具有以下架构:
{
_id : int
products : [
{
qte : int
status : string
},
{
qte : int
status : string
},
{
qte : int
status : string
},
...
]
}
我正在尝试运行db.collection.find({ }) 查询返回文档,其中所有 产品不 将字符串“完成”作为状态。请注意products 数组的长度是可变的。
我们也可以说我们希望所有文档至少包含一种状态不是“完成”的产品。
如果我将它作为 Javascript 循环 运行,我们会得到如下内容:
// Will contain queried documents
var matches = new Array();
// The documents variable contains all documents of the collection
for (var i = 0, len = documents.length; i < len; i++) {
var match = false;
if (documents[i].products && documents[i].products.length !== 0) {
for (var j = 0; j < documents[i].products; j++) {
if (documents[i].products[j].status !== "finished") {
match = true;
break;
}
}
}
if (match) {
matches.push(documents[i]);
}
}
// The previous snippet was coded directly in the Stack Overflow textarea; I might have done nasty typos.
matches 数组将包含我要查找的文档。现在,我希望有一种类似于collection.find({"products.$.status" : {"$ne":"finished"}}) 的方法,但是当我这样做时,MongoDB 讨厌我的脸。
此外,没有任何产品的文档需要被忽略,但我已经用$and 子句解决了这个问题。请注意,我需要返回 ENTIRE 文档,而不仅仅是产品数组。如果文档包含未“完成”的产品,则应显示整个文档。如果一个文档的所有产品都设置为“已完成”,则根本不会返回该文档。
MongoDB 版本:3.2.4
示例
假设我们有一个包含三个文档的集合。
这个会匹配,因为其中一个状态不是“完成”。
{
_id : 1,
products : [
{
qte : 10,
status : "finished"
},
{
qte : 21,
status : "ongoing"
},
]
}
这不匹配,因为所有状态都设置为“完成”
{
_id : 2,
products : [
{
qte : 35,
status : "finished"
},
{
qte : 210,
status : "finished"
},
{
qte : 2,
status : "finished"
},
]
}
这也不匹配,因为没有产品。如果 products 字段未定义,它也不会匹配。
{
_id : 3,
products : []
}
同样,如果我们在本例中包含三个文档的集合中运行查询,输出将是:
[
{
_id : 1,
products : [
{
qte : 10,
status : "finished"
},
{
qte : 21,
status : "ongoing"
},
]
}
]
只有第一个文档被退回,因为它至少有一个产品的状态不是“已完成”,但最后两个没有成功,因为它们的所有产品的状态都设置为“已完成” ",或者根本没有任何产品。
【问题讨论】:
-
所以帮助我用简单的英语理解!您是否正在尝试查找状态已完成但想要排除没有状态的文档的文档?
-
@Saleem 正如第二段中提到的,这正是我正在寻找的。 “products”数组中包含的所有对象的“status”字段与“finished”字段不同的文档。
-
听起来不错。那么 products 数组可能有多个
status字段?如果是这种情况,请使用完整的示例文档更新您的帖子。 -
@Saleem 否。数组包含对象。每个对象都有一个
status字段。看一下第一段文字。它代表一个文档模式。数组products包含的对象都具有status字段。 -
知道了。看看我下面的帖子。希望它是你在找什么。
标签: javascript mongodb mongodb-query aggregation-framework