可以在同一个查询中使用运算符"$ ne"和"$ elemMatch"吗?

Ric*_*rdo 11 mongodb mongodb-query

我试图找到所有文件,tipo=CD而canciones不包含具有title=Pajaritos和的子文档cancion=2

这是我想在canciones现场实现的目标:

not (title=Pajaritos and cancion=2)
Run Code Online (Sandbox Code Playgroud)

我有以下集合:

{ 
    "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" 
        }
 }
Run Code Online (Sandbox Code Playgroud)

我的查询

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

我不受欢迎的结果

{ "_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" } ] }
Run Code Online (Sandbox Code Playgroud)

如您所见,结果包含"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" } ] }
Run Code Online (Sandbox Code Playgroud)

man*_*013 14

为了得到预期的结果,我会使用$ not运算符而不是$ ne运算符.在$不是运营商将非常匹配否定$ elemMatch并得到预期的结果.因此,您的查询应为:

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

我希望它有所帮助.

  • 不,我正在尝试“不(canciones.titullo=Pajaritos and canciones.cancion=2)” (2认同)