我试图找到tipo=CD
和canciones不包含title=Pajaritos
和cancion=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" } ] }
答案 0 :(得分:11)
为了获得预期的结果,我会使用$not运算符而不是$ne运算符。 $not运算符非常匹配否定$elemMatch并为您提供预期结果。因此,您的查询应为:
db.media.find({
"tipo": "CD",
"canciones": {
"$not": {
"$elemMatch": {
"titulo": "Pajaritos",
"cancion": 2
}
}
}
})
我希望它有所帮助。