gpt4 book ai didi

javascript - 匹配所有数组成员都不包含值的文档

转载 作者:可可西里 更新时间:2023-11-01 09:29:27 24 4
gpt4 key购买 nike

MongoDB 选择器很快变得复杂,尤其是当您来自 mySQL 使用 JOIN 和其他花哨的关键字时。我尽了最大努力使这个问题的标题尽可能清楚,但惨遭失败。

例如,让 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"
},
]
}
]

只有第一个文档被返回,因为它至少有一个产品的状态不是“已完成”,但最后两个没有成功,因为它们的所有产品状态都设置为“已完成” ",或者根本没有任何产品。

最佳答案

尝试以下查询。它正在获取状态不等于 "finished"

的文档

Note: This query will work with MongoDB 3.2+ only

db.collection.aggregate([
{
$project:{
"projectid" : 1,
"campname" : 1,
"campstatus" : 1,
"clientid" : 1,
"paymentreq" : 1,
products:{
$filter:{
input:"$products",
as: "product",
cond:{$ne: ["$$product.status", "finished"]}
}
}
}
},
{
$match:{"products":{$gt: [0, {$size:"products"}]}}
}
])

关于javascript - 匹配所有数组成员都不包含值的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36298596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com