仅使用find方法查询MongoDB中的对象数组

时间:2017-04-18 12:23:30

标签: mongodb mongodb-query

在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)可以返回:

  1. 具有以下所有标记的联系人:[tagA,tagC]
  2. 没有所有这些标签的联系人:[tagC,tagD]
  3. 2017年所有代码的联系人
  4. 先谢谢

1 个答案:

答案 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")}}]}}}})