【发布时间】:2020-12-13 04:13:55
【问题描述】:
在 MongoDB 3.4 上的 contacts 集合中查看以下文档:
{
"_id" : ObjectId("58f045526320ef24fc61fdb2"),
"name" : "John Doe",
"tags" : [
{
"name": "tagA",
"created_at": ISODate("2017-01-27T10:30:00Z")
},
{
"name": "tagB",
"created_at": ISODate("2017-01-28T13:30:00Z")
}
],
},
{
"_id" : ObjectId("58f045526320ef24fc61fdb3"),
"name" : "Johnny Doe",
"tags" : [
{
"name": "tagA",
"created_at": ISODate("2016-12-21T19:30:00Z")
},
{
"name": "tagC",
"created_at": ISODate("2017-01-28T13:30:00Z")
}
],
}
.
.
.
是否有任何只使用 find 方法(也不是聚合框架,也不是 $where)可以返回的查询:
- 具有以下所有标签的联系人:[tagA, tagC]
- 没有所有这些标签的联系人:[tagC, tagD]
- 2017年所有标签的联系人
【问题讨论】:
-
到目前为止您尝试了什么?你得到的错误是什么?
-
我只是找不到查询来返回满足这些条件的联系人。请注意,它不是返回例如具有 tagA 或 tagC 的联系人的经典查询。
-
看看stackoverflow.com/questions/23595023/…。它有类似的例子进行“完全匹配”——这意味着这些答案显示了如何找到具有精确标签集的联系人。例如回答问题1,
db.collection.find({"tags": {"$not": {"$elemMatch": {"name": {"$nin": ["tagA", "tagC"]}}}}}) -
谢谢@JeffJ,我想现在我可以使用您在另一篇 stackoverflow 帖子中评论的关键点编写上面的三个查询:将 $not 应用于子集的补集。您现在可以继续回答问题,对每个案例进行查询,以便我可以接受正确的答案。
-
我真的没有好的数据可以测试。你可以试试
db.collection.find({ "tags.name": { $all: [ "tagA" , "tagB" ], $nin: [ "tagC" , "tagD" ]},"tags.created_at":{$gte: ISODate("2017-01-01"),$lt:ISODate("2018-01-01")}});
标签: mongodb mongodb-query