在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")
}
],
}
.
.
.
是否有任何查询仅使用查找方法(也不是聚合框架,也不是$ where)可以返回:
先谢谢
答案 0 :(得分:1)
我在Check if every element in array matches condition找到了类似的问题。
要查找具有以下所有标记的联系人:[tagA, tagC]
,您可以使用双重否定来查找不包含[tagA, tagC]
db.collection.find({"tags": {"$not": {"$elemMatch": {"name": {"$nin": ["tagA", "tagC"]}}}}})
要查找没有所有这些标记的联系人:[tagC, tagD]
db.collection.find({"tags": {"$elemMatch": {"name": {"$nin": ["tagC", "tagD"]}}}})
虽然使用$or
db.collection.find({"tags": {"$not": {"$elemMatch": {"$or": [
{"createdAt": {"$lt": ISODate("2017-01-01T00:00:00.000Z")}},
{"createdAt": {"$gt": ISODate("2017-12-31T23:59:59.999Z")}}]}}}})