Мангуст $и фильтр не фильтруются должным образом

#node.js #mongodb #mongoose

Вопрос:

$and Оператор в Мангусте неправильно работает в NodeJS. Давайте предположим, что у нас есть эти данные JSON-MongoDB:

 { 
    "_id" : ObjectId("60bb4cd74a802722d8b0de0f"), 
    "username" : "System", 
    "text" : "matan has joined!", 
    "__v" : NumberInt(0)
}
{ 
    "_id" : ObjectId("60bb4cd74a802722d8b0de10"), 
    "username" : "System", 
    "text" : "Welcome!", 
    "__v" : NumberInt(0)
}
{ 
    "_id" : ObjectId("60bb4cdb4a802722d8b0de11"), 
    "username" : "matan", 
    "text" : "Hello World", 
    "__v" : NumberInt(0)
}
{ 
    "_id" : ObjectId("60bb4ce14a802722d8b0de12"), 
    "username" : "System", 
    "text" : "matan has left.", 
    "__v" : NumberInt(0)
}
 

Я хочу отфильтровать данные, чтобы все System's Welcome сообщения были удалены. Например, этот вывод будет показан:

 { 
    "_id" : ObjectId("60bb4cd74a802722d8b0de0f"), 
    "username" : "System", 
    "text" : "matan has joined!", 
    "__v" : NumberInt(0)
}
{ 
    "_id" : ObjectId("60bb4cdb4a802722d8b0de11"), 
    "username" : "matan", 
    "text" : "Hello World", 
    "__v" : NumberInt(0)
}
{ 
    "_id" : ObjectId("60bb4ce14a802722d8b0de12"), 
    "username" : "System", 
    "text" : "matan has left.", 
    "__v" : NumberInt(0)
}
 

Но вместо этого отображается только этот вывод:

 {
    _id: 60bb4cdb4a802722d8b0de11,
    username: 'matan',
    text: 'Hello World',
    __v: 0
}
 

Это мой код (NodeJS):

 var msgs = Msg.find({
            $and: [
                { username: {$ne: "System"} },
                { text: {$ne: "Welcome!"} }
            ]
        }, (err, retn) => console.log(retn))
 

Я пропустил что-то важное? Спасибо за помощь.

Комментарии:

1. Я хочу отфильтровать данные, чтобы все приветственные сообщения Системы были удалены => почему > $ne ? использовать $eq .

2. Мне нужны все данные, кроме приветствия системы.

3. просто используйте $or вместо $and .

4. $or не будет работать, потому что кто-то другой также может отправить Welcome! сообщение или System может отправить сообщение, которого нет Welcome! .

5. @NenadMilosavljevic он просто хочет исключить приветственное сообщение системы, $или не будет исключать другие приветственные сообщения. смотрите детскую площадку

Ответ №1:

$and Условие с $ne будет соответствовать тому, что оба поля не должны быть равны значению.

Вы можете просто попробовать $or условие,

 var msgs = Msg.find({
  $or: [
    { username: { $ne: "System" } },
    { text: { $ne: " Welcome!" } }
  ]
}, (err, retn) => console.log(retn))
 

Игровая площадка

Ответ №2:

Вы можете использовать Конвейер агрегации:

  • $addFields чтобы добавить новое поле flag , которое будет true , если будут выполнены оба требования ( username равно System и text равно Welcome! ) или false иначе.
  • $match для фильтрации всех документов, в которых новое поле flag равно false
  • $project чтобы удалить новое поле flag из конечного результата
 db.collection.aggregate([
  {
    "$addFields": {
      "flag": {
        "$cond": {
          if: {
            "$and": [
              {
                "$eq": [
                  "$username",
                  "System"
                ]
              },
              {
                "$eq": [
                  "$text",
                  "Welcome!"
                ]
              }
            ]
          },
          then: true,
          else: false
        }
      }
    }
  },
  {
    "$match": {
      "flag": false
    }
  },
  {
    "$project": {
      "flag": 0
    }
  }
])
 

Вот рабочий пример: https://mongoplayground.net/p/ENDzUW8igJP

Ответ №3:

Вместо этого используйте оператор $или

     var msgs = Msg.find({
        $or: [
            { username: {$ne: "System"} },
            { text: {$ne: "Welcome!"} }
        ]
    }, (err, retn) => console.log(retn))