我想在数组中添加一个子文档(如果它尚不存在),然后在一个查询中返回新添加的子文档(或至少是子文档数组) . 这是一个示例文档结构:

{
    "name": "John Smith",
    "folders": [
        {
            "folderName": "Breweries"
            "updatedAt": 1450210046338,
            "checkins": [
                {
                    "facebookID": "123",
                    "checkinID": "3480809",
                    "addedOn": 1450210046338
                },
                {
                    "facebookID": "234",
                    "checkinID": "345254",
                    "addedOn": 1450210046339
                }
            ],
        },
        {
            "folderName": "Food"
            "updatedAt": 1450210160277,
            "checkins": [
                {
                    "facebookID": "432",
                    "checkinID": "123545426",
                    "addedOn": 1450210160277
                }
            ],
        }
    ],
}

下面的嵌套查询检查文件夹数组中是否已存在新文件夹的名称 . 如果它尚不存在,则将新文件夹添加到folders数组:

(在这里使用mongoskin)

mongodb.collection('users').findOne(
    {facebookID: facebookID, 'folders.folderName': folderName},
    function (err, result) {
      if (err) {
        deferred.reject(err);
      } else if (result !== null) {
        deferred.reject(new Error('Folder name already taken'));
      } else {
            mongodb.collection('users').findOne(
    {facebookID: facebookID, 'folders.folderName': folderName},
    function (err, result) {
      if (err) {
        deferred.reject(err);
      } else if (result !== null) {
        deferred.reject(new Error('Folder name already taken'));
      } else {
        mongodb.collection('users').findAndModify(
            {facebookID: facebookID},
            [],
            {$addToSet: {folders: newFolder}},
            {fields:{'folders': 1}, new: true},
            function (err, result) {
              if (err) {
                deferred.reject(err);
              } else {
                deferred.resolve(result);
              }
            });
      }
    });

看起来您应该能够在一个查询中执行此操作 - 但我找不到使用数组运算符实现$ setOnInsert功能的方法($ addToSet / $ push) .