【问题标题】:Is possible use the operators "$ne" and "$elemMatch" in same query?是否可以在同一查询中使用运算符“$ne”和“$elemMatch”?
【发布时间】:2015-05-25 18:23:36
【问题描述】:

我正在尝试查找 tipo=CD 和 canciones 不包含具有 title=Pajaritoscancion=2 的子文档的所有文档

这是我喜欢在canciones字段中实现的:

not (title=Pajaritos and cancion=2)

我有以下收藏:

{ 
    "tipo": "CD",
    "Artista":"Los piratas",
    "Titulo": "Recuerdos",
    "canciones": [
        {
            "cancion":1,
            "titulo":"Adios mi barco",
            "longitud": "3:20"
         },
         {
            "cancion":2,
            "titulo":"Pajaritos",
            "longitud": "4:15"
         }
     ]
},
{ 
    "tipo": "CD",
    "Artista":"Los piratas",
    "Titulo": "Recuerdos",
    "canciones": [
        {
            "cancion":1,
            "titulo":"Adios mi barco",
            "longitud": "3:20"
        },
        {
            "cancion":3,
            "titulo":"Pajaritos",
            "longitud": "4:15" 
        }
    ]
},

{ 
    "tipo": "CD",
    "Artista":"Los piratas",
    "Titulo": "Recuerdos",
    "canciones": [
        {
            "cancion":1,
            "titulo":"Adios mi barco",
            "longitud": "3:20"
        },
        {
            "cancion":3,
            "titulo":"Pajaritos",
            "longitud": "4:15" 
        },
        {
            "cancion":4,
            "titulo":"Pajaritos4",
            "longitud": "44:15" 
        }
 }

我的查询

db.media.find({"tipo" : "CD" ,"canciones" : { "$ne" : {"$elemMatch" :  {"titulo" : "Pajaritos", "cancion" : 2}}}})

我不想要的结果

{ "_id" : ObjectId("550f0a1c009ed3a1c9bbcdc1"), "tipo" : "CD", "Artista" : "Los piratas", "Titulo" : "Recuerdos", "canciones" : [ { "cancion" : 1, "titulo" : "Adios mi barco", "longitud" : "3:20" }, { "cancion" : 2, "titulo" : "Pajaritos", "longitud" : "4:15" } ] }
{ "_id" : ObjectId("550f0a1c009ed3a1c9bbcdc2"), "tipo" : "CD", "Artista" : "Los piratas", "Titulo" : "Recuerdos", "canciones" : [ { "cancion" : 1, "titulo" : "Adios mi barco", "longitud" : "3:20" }, { "cancion" : 3, "titulo" : "Pajaritos", "longitud" : "4:15" } ] }
{ "_id" : ObjectId("550f0a1c009ed3a1c9bbcdc3"), "tipo" : "CD", "Artista" : "Los piratas", "Titulo" : "Recuerdos", "canciones" : [ { "cancion" : 1, "titulo" : "Adios mi barco", "longitud" : "3:20" }, { "cancion" : 3, "titulo" : "Pajaritos", "longitud" : "4:15" }, { "cancion" : 4, "titulo" : "Pajaritos4", "longitud" : "44:15" } ] }

如您所见,结果包含试图避免的"titulo" : "Pajaritos"

尝试使用$not 运算符而不是$ne

{ "_id" : ObjectId("550f173fc357b7a4e7a46e10"), "tipo" : "CD", "Artista" : "Los piratas", "Titulo" : "Recuerdos", "canciones" : [ { "cancion" : 1, "titulo" : "Adios mi barco", "longitud" : "3:20" }, { "cancion" : 3, "titulo" : "Pajaritos", "longitud" : "4:15" } ] }
{ "_id" : ObjectId("550f173fc357b7a4e7a46e11"), "tipo" : "CD", "Artista" : "Los piratas", "Titulo" : "Recuerdos", "canciones" : [ { "cancion" : 1, "titulo" : "Adios mi barco", "longitud" : "3:20" }, { "cancion" : 3, "titulo" : "Pajaritos", "longitud" : "4:15" }, { "cancion" : 4, "titulo" : "Pajaritos4", "longitud" : "44:15" } ] }

【问题讨论】:

  • 您只想要canciones 中与给定条件或文档匹配的子文档吗?
  • @Michael 我想要这份文件。

标签: mongodb mongodb-query


【解决方案1】:

为了获得预期的结果,我将使用$not 运算符而不是$ne 运算符。 $not 运算符将完全匹配否定 $elemMatch 并为您提供预期的结果。因此,您的查询应为:

db.media.find({
    "tipo": "CD",
    "canciones": {
        "$not": {
            "$elemMatch": {
                "titulo": "Pajaritos",
                "cancion": 2
            }
        }
    }
})

希望对你有帮助。

【讨论】:

  • 我已经尝试过使用 $not 运算符,让我更加困惑,因为仍然显示“Pajaritos”,但结果少了一个。我更新了问题。
  • 哦,我想我更了解您想要实现的目标。您不希望结果包含“canciones.titullo”=“Pajaritos”的文档或“cancans.cancion”=2 的文档。正确吗?
  • 不,我正在尝试“不(canciones.titullo=Pajaritos and canciones.cancion=2)”
  • 在这种情况下,从您提供的示例数据来看,应该返回 2 个文档。
  • 您是否想要(在同一数组元素中)titullo 不是 "Parajitos" AND cancion 不是 2 的文档,或者是 titullo 不是 2 或 cancion 的文档not 2. 根据 DeMorgan 定律,not (titullo=Pajaritoscancion=2) 等价于后者——“not both”等价于“not one or not the other”。它不等同于“非一非二”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
相关资源
最近更新 更多