Mongodb不会在if/else语句中创建文档

Mongodb不会在if/else语句中创建文档,mongodb,Mongodb,MongoDB的新成员。只有在现有集合中不存在同名文档时,我才尝试将新文档添加到该集合中。我首先使用if/else语句检查是否有与新条目同名的文档,如果没有,则使用else语句创建新条目。无论我尝试什么,新文档都不会被添加,而是返回一个空数组。如果有任何帮助,我将不胜感激 我尝试过切换if/else语句;在返回if语句时检查空值和未定义值 app.post('/cocktails/new', isLoggedIn, (req, res) => { // add to DB then sho

MongoDB的新成员。只有在现有集合中不存在同名文档时,我才尝试将新文档添加到该集合中。我首先使用if/else语句检查是否有与新条目同名的文档,如果没有,则使用else语句创建新条目。无论我尝试什么,新文档都不会被添加,而是返回一个空数组。如果有任何帮助,我将不胜感激

我尝试过切换if/else语句;在返回if语句时检查空值和未定义值

app.post('/cocktails/new', isLoggedIn, (req, res) => {
// add to DB then show item
    let name = req.body.name;
    let style = req.body.style;
    let spirit = req.body.spirit;
    let image = req.body.image;
    let description = req.body.description;
    let newCocktail = {name: name, style: style, base: spirit, image: 
    image, description: description}
    Cocktail.find({name}, function (err, existCocktail) {
        if(existCocktail){
            console.log(existCocktail)
}
 else {Cocktail.create(newCocktail, (err, cocktail) => {
console.log(cocktail)
if (err) {console.log(err)}
else {
res.redirect('/cocktails/' + cocktail._id)}
})

        }
    })
})

如果使用if函数找不到文档,则将执行else语句,从而使用newcockbox对象创建新文档。

您应该使用findOne而不是find

当找不到文档时,find返回空数组

下面的表达式返回true,因此existcocktack条件变为true,导致未添加新数据

[] ? true : false
此外,我还对代码进行了一些重构,您可以使用destructuring您的req.body

app.post("/cocktails/new", isLoggedIn, (req, res) => {
  // add to DB then show item

  const { name, style, spirit, image, description } = red.body;

  let newCocktail = {
    name,
    style,
    base: spirit,
    image,
    description
  };
  Cocktail.findOne({ name }, function(err, existCocktail) {
    if (existCocktail) {
      console.log(existCocktail);
      res.status(400).json({ error: "Name already exists" });
    } else {
      Cocktail.create(newCocktail, (err, cocktail) => {
        console.log(cocktail);
        if (err) {
          console.log(err);
          res.status(500).json({ error: "Something went bad" });
        } else {
          res.redirect("/cocktails/" + cocktail._id);
        }
      });
    }
  });
});

这就成功了。非常感谢。知道为什么FindOne有效但没有找到吗?@monkeytrick很高兴听到这个消息,你能接受这个答案吗?@monkeytrick Find总是返回smth。如果没有找到任何内容,则返回一个空列表。因此,检查“existCocktail”总是正确的。@S.Kuiter谢谢,我会将此添加到答案中。@monkeytrick我通过编辑答案解释了find的问题。