gpt4 book ai didi

mongodb - mongo 查询缺少键的对象

转载 作者:可可西里 更新时间:2023-11-01 10:30:50 25 4
gpt4 key购买 nike

我有一个 Mongo 数据库,其中的数据以这种格式存储:

{ "_id" : ObjectId("53e27f602041f3c6fe5373a8"), 
"miles" : 112650,
"history" : [ { "date" : ISODate("2014-05-26T00:00:00Z"), "price" : 8995 },
{ "date" : ISODate("2014-06-01T00:00:00Z"), "price" : 8995 } ] }

数据库中的对象可以将任意数量的“日期”和“价格”数据点存储在历史数组中。但是,数据库中的某些对象将具有多个历史数据点,但最后一个“日期”键/值对与“价格”键/值对不匹配,如下所示:

{ "_id" : ObjectId("53e27f602041f3c6fe5373a8"), 
"miles" : 112650,
"history" : [ { "date" : ISODate("2014-05-26T00:00:00Z"), "price" : 8995 },
{ "date" : ISODate("2014-06-01T00:00:00Z")} ] }

我需要查询数据库以查找 1) 历史数组中每个条目都有日期和价格的所有对象,以及 2) 历史数组中有“日期”条目但与“不匹配”的所有对象价”条目。感谢您的帮助!

最佳答案

首先回答“2”的原因将会变得很清楚,您基本上是要查找其数组元素确实包含“日期”值但不包含“价格”的文档。由于您想要的数组元素匹配有两个条件 $elemMatch .并测试您想要的字段是否存在 $exists像这样:

db.collection.find({
"history": {
"$elemMatch": {
"date": { "$exists": true },
"price": { "$exists": false }
}
}
})

这将返回您的第二个样本,因为其中一个数组条目没有“价格”。

为了回答“1”,这基本上只是上面逻辑的反转,所以你在这里介绍的是$not运算符(operator):

db.collection.find({
"history": {
"$not": {
"$elemMatch": {
"date": { "$exists": true },
"price": { "$exists": false }
}
}
}
})

这会生成示例中的第一个文档,因为在这种情况下,“价格”存在于所有元素中,因此断言的条件将为 false 但这可以通过使用 $not 来扭转

关于mongodb - mongo 查询缺少键的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25634516/

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